এর মধ্যে কৌনিক এনজি-বাইন্ড-এইচটিএমএল এবং নির্দেশিকা


95

প্লঙ্কার লিঙ্ক

আমার একটি উপাদান রয়েছে যা আমি এটির সাথে html বাঁধতে চাই।

<div ng-bind-html="details" upper></div>

ওই কাজগুলো. এখন, এর সাথে আমার একটি নির্দেশিকাও রয়েছে যা আবদ্ধ এইচটিএমএল এর সাথে আবদ্ধ:

$scope.details = 'Success! <a href="#/details/12" upper>details</a>'

তবে upperডিভ এবং অ্যাঙ্কর সহ নির্দেশনা মূল্যায়ন করে না। আমি কীভাবে এটি কাজ করব?


4
আমার উত্তর লক্ষ্য করবেন সেগুলো এখানে stackoverflow.com/questions/17343696/...
Chandermani

@ চান্ডারম্যানি সঠিকভাবে এনজি-বাইন্ড-এইচটিএমএল-অনিরাপদ ভিতরে নির্দেশনা ব্যবহার করছে না তবে ফিল্টার ব্যবহার করছে। তবে এটি করবে, আমি কেবল একটি ফিল্টার তৈরি করেছি এবং নির্দেশকে দিয়েছি। ধন্যবাদ!
অমিতাভ

@ স্যামসারিয়াস আপনি কি ফিল্টারগুলির জন্য যা করেছেন তা আপনি কীভাবে প্রদর্শন করতে সক্ষম হন?
সিএমসিডিগ্রাগনকাই

উপরে সমাধান মান একাধিক পরিবর্তন একটি ভাল সমাধান হ্যান্ডেল না stackoverflow.com/a/25516311/3343425
fghibellini

উত্তর:


187

আমিও এই সমস্যার মুখোমুখি হয়েছি এবং ঘন্টার পর ঘন্টা ইন্টারনেট অনুসন্ধান করার পরে আমি @ চন্দমণির মন্তব্য পড়লাম, যা সমাধান হিসাবে প্রমাণিত হয়েছে। আপনাকে এই প্যাটার্নটির সাথে একটি 'সংকলন' নির্দেশিকা কল করতে হবে:

এইচটিএমএল:

<div compile="details"></div>

জেএস:

.directive('compile', ['$compile', function ($compile) {
    return function(scope, element, attrs) {
        scope.$watch(
            function(scope) {
                // watch the 'compile' expression for changes
                return scope.$eval(attrs.compile);
            },
            function(value) {
                // when the 'compile' expression changes
                // assign it into the current DOM
                element.html(value);

                // compile the new DOM and link it to the current
                // scope.
                // NOTE: we only compile .childNodes so that
                // we don't get into infinite loop compiling ourselves
                $compile(element.contents())(scope);
            }
        );
    };
}])

আপনি এটির একটি কার্যকারী ফলল দেখতে পারেন


4
লাইনে # 2, মানে। function(scope, element, attrs), আপনি এই তিনটি যুক্তি, সুযোগ , উপাদান এবং অ্যাটর্স থেকে কোথায় পেলেন ?
স্পাফি

4
@ স্পাফি - তারা linkসম্পত্তির জন্য কৌণিক কাঠামোর স্বাক্ষরের অংশ । linkকৌণিক কাঠামোর দ্বারা ডাকলে এগুলি স্বয়ংক্রিয়ভাবে পাস হয়ে যাবে । এগুলি সর্বদা উপলব্ধ থাকবে।
বেন

4
সাবাশ. আপনি সেই একই ঘন্টা অনুসন্ধানের সময় আমাকে বাঁচিয়েছেন। আমি শেয়ারপয়েন্ট ভিউ আরএসটি এপিআই থেকে সামগ্রী টানছি, এতে নিজেই এনজি-রিপিটের মতো কৌণিক মার্কআপ রয়েছে। আপনার নির্দেশিকাটি এটি সমস্ত কাজ করেছে। ধন্যবাদ!
ফিল নিকোলাস

আপনার নির্দেশনার জন্য ধন্যবাদ এটি আমার যা সমস্যা ছিল তা ঠিক করেছিল। এখন কৌনিক কোডটি সংকলিত হয়ে গেছে তবে অনেক বার। 3 অবজেক্ট সহ একটি এনজি-পুনরাবৃত্তি প্রতিটি মাত্র 3x এর একই মানগুলিতে পরিণত হয়। এখানে কি ভুল হচ্ছে?
জেসন

4
আপনি যদি $sce.trustAsHtmlএই নির্দেশনাটির সাথে "সংকলিত" হবে এইচটিএমএল তৈরি করতে অন্য কোনও ফাংশন থেকে ব্যবহার করছেন , আপনার এটি অপসারণ করা উচিত। ধন্যবাদ @ জনপ্রেমিক
বুড়াক টোকাক

36

মহান উত্তর vkammerer জন্য ধন্যবাদ। একটি অপ্টিমাইজেশন যা আমি সুপারিশ করব তা একবার সংকলন চলার পরে অন-নজর রাখা। Watch ঘড়ির অভিব্যক্তির মধ্যে alওয়ালটির পারফরম্যান্সের প্রভাব থাকতে পারে।

    angular.module('vkApp')
  .directive('compile', ['$compile', function ($compile) {
      return function(scope, element, attrs) {
          var ensureCompileRunsOnce = scope.$watch(
            function(scope) {
               // watch the 'compile' expression for changes
              return scope.$eval(attrs.compile);
            },
            function(value) {
              // when the 'compile' expression changes
              // assign it into the current DOM
              element.html(value);

              // compile the new DOM and link it to the current
              // scope.
              // NOTE: we only compile .childNodes so that
              // we don't get into infinite loop compiling ourselves
              $compile(element.contents())(scope);

              // Use un-watch feature to ensure compilation happens only once.
              ensureCompileRunsOnce();
            }
        );
    };
}]);

এখানে একটি কাঁটাচামচ এবং আপডেট করা ফিডল।


আমি কি এর বিপরীতে থাকতে পারি?
সানিয়াম জৈন


4
সতর্কতা: এই উত্তরের মূর্খতা কাজ করে, তবে .directive()উত্তরে পোস্ট করা কোডের কোডটি কার্যকর করে না।
ফিল নিকোলাস

এই আমার জন্য কাজ করে। নির্বাচিত উত্তরটি "ত্রুটি: $ রুটস্কোপ: অনন্ত $ ডাইজেস্ট লুপকে ইনফিগড করবে"
গ্যাব্রিয়েল আন্দ্রেই

আপনার এক্সপ্লিট প্রয়োজন হবে না $eval- আপনি কেবল দেখা বেনাম কর্মের attrs.compileজায়গায় সরাসরি ব্যবহার করতে পারেন । আপনি যদি কেবল একটি স্ট্রিং এক্সপ্রেশন সরবরাহ করেন তবে কৌণিক $evalএটি যাইহোক কল করবে ।
ড্যান কিং

28

এই নির্দেশিক কৌণিক-বাইন্ড-এইচটিএমএল-সংকলন যুক্ত করুন

.directive('bindHtmlCompile', ['$compile', function ($compile) {
  return {
    restrict: 'A',
    link: function (scope, element, attrs) {
      scope.$watch(function () {
        return scope.$eval(attrs.bindHtmlCompile);
      }, function (value) {
        // Incase value is a TrustedValueHolderType, sometimes it
        // needs to be explicitly called into a string in order to
        // get the HTML string.
        element.html(value && value.toString());
        // If scope is provided use it, otherwise use parent scope
        var compileScope = scope;
        if (attrs.bindHtmlScope) {
          compileScope = scope.$eval(attrs.bindHtmlScope);
        }
        $compile(element.contents())(compileScope);
      });
    }
  };
}]);

এটি এর মতো ব্যবহার করুন:

<div bind-html-compile="data.content"></div>

সত্যিই সহজ :)


4
সতর্কতা অবলম্বন করুন, যদি আপনি এই জাতীয় কিছু পাস করেন: "$ સ્કોপ। লোড কনটেন্ট = ফাংশন () {রিটার্ন $ sce.trustAsHtml (প্রয়োজন ('এইচটিএমএল / মূল-বিষয়বস্তু। Html'));"; " এটিতে আপনি অসীম ডাইজেস্ট লুপ পেতে পারেন। ট্রাস্টএএসএইচটিএমএল ছাড়া এটি কাজ করে।
লাকাতোস গায়ুলা

13

দুর্ভাগ্যক্রমে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই।

আমি যুগ যুগ ধরে এটি কাজ করতে পারি না। ng-bind-htmlএই কাস্টম নির্দেশটি ব্যবহার করতে আমি আমার কোডটি সংশোধন করেছি , তবে $scope.html = $sce.trustAsHtml($scope.html)এনজি-বাইন্ড-এইচটিএমএল কাজ করার জন্য যা প্রয়োজন তা সরিয়ে ফেলতে আমি ব্যর্থ হয়েছি । আমি এটি মুছে ফেলার সাথে সাথেই কম্পাইল ফাংশনটি কাজ করা শুরু করে।


6

ইতিমধ্যে $sce.trustAsHtmlএখানে চলে আসা সামগ্রীর সাথে যে কারওর সাথে व्यवहार করা, আমার পক্ষে অন্যরকম কিছু করতে হয়েছিল

function(scope, element, attrs) {
    var ensureCompileRunsOnce = scope.$watch(function(scope) {
            return $sce.parseAsHtml(attrs.compile)(scope);
        },
        function(value) {
            // when the parsed expression changes assign it into the current DOM
            element.html(value);

            // compile the new DOM and link it to the current scope.
            $compile(element.contents())(scope);

            // Use un-watch feature to ensure compilation happens only once.
            ensureCompileRunsOnce();
        });
}

এটি কেবল link নির্দেশের অংশ হিসাবে আমি একটি ভিন্ন লেআউট ব্যবহার করছি। আপনার $sceপাশাপাশি পরিষেবাটি ইনজেকশন করতে হবে $compile


-2

আমি কি খুঁজে পেয়েছি সেরা সমাধান! আমি এটি অনুলিপি করেছি এবং এটি আমার প্রয়োজন মতো কাজ করেছে। ধন্যবাদ, ধন্যবাদ, ধন্যবাদ ...

ডাইরেক্টিভ লিঙ্ক ফাংশন আমার আছে

app.directive('element',function($compile){
  .
  .
     var addXml = function(){
     var el = $compile('<xml-definitions definitions="definitions" />')($scope);
     $scope.renderingElement = el.html();
     }
  .
  .

এবং নির্দেশমূলক টেমপ্লেটে:

<span compile="renderingElement"></span>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.