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


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.