कोणीय एनजी-बाइंड-html और इसके भीतर निर्देश


96

प्लंकर लिंक

मेरे पास एक तत्व है जो मैं इसे html को बांधना चाहूंगा।

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

यह काम करता है। अब, इसके साथ मेरे पास एक निर्देश भी है जो बाध्य HTML से जुड़ा है:

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

लेकिन upperडिव और एंकर के साथ निर्देश का मूल्यांकन नहीं होता है। मैं इसे काम करने लायक कैसे बनाऊ?


3
मेरे जवाब को यहां देखें stackoverflow.com/questions/17343696/…
Chandermani

@Chandermani वास्तव में एनजी-बाइंड-html-असुरक्षित के अंदर निर्देश का उपयोग नहीं कर रहा है, लेकिन फिल्टर का उपयोग कर रहा है। लेकिन यह होगा, मैंने सिर्फ एक फिल्टर बनाया और निर्देशन के लिए पारित किया। धन्यवाद!
अमिताव जूल

@Sam रहस्यमय क्या आप यह दिखाने में सक्षम हैं कि आपने फ़िल्टर के लिए क्या किया?
CMCDragonkai

उपरोक्त समाधान मूल्य के कई बदलावों को नहीं संभालते हैं एक बेहतर समाधान stackoverflow.com/a/25516311/3343425
fghibellini

जवाबों:


188

मैं भी इस समस्या का सामना कर रहा था और घंटों इंटरनेट पर सर्च करने के बाद मैंने @ चंद्रमणि की टिप्पणी पढ़ी, जो समाधान साबित हुई। आपको इस पैटर्न के साथ एक 'संकलन' निर्देश कॉल करने की आवश्यकता है:

HTML:

<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);
            }
        );
    };
}])

आप इसका एक कामकाजी फ़लक यहाँ देख सकते हैं


1
लाइन # 2 में, अर्थात। function(scope, element, attrs), आप उन तीन तर्कों, गुंजाइश , तत्व और दृष्टिकोण से कहां से आए ?
पाड़

1
@spaffy - वे linkसंपत्ति के लिए कोणीय ढांचे के हस्ताक्षर का हिस्सा हैं। जब linkकोणीय ढांचे द्वारा कॉल किया जाता है तो वे हर बार स्वचालित रूप से पास हो जाएंगे । वे हमेशा उपलब्ध रहेंगे।
बेन

1
बहुत बढ़िया। आपने मुझे खोज के उन्हीं घंटों को बचाया। मैं SharePoint दृश्य REST API से सामग्री खींच रहा हूं, जिसमें स्वयं को एनजी-मार्क जैसे एनजी-रिपीट शामिल हैं। आपके निर्देश ने यह सब काम कर दिया। धन्यवाद!
फिल निकोलस

आपके निर्देश के लिए धन्यवाद, इससे मुझे होने वाली समस्याओं को ठीक किया गया। अब कोणीय कोड संकलित हो जाता है लेकिन कई बार। 3 ऑब्जेक्ट के साथ एनजी-रिपीट 3 डी प्रत्येक में समान मूल्यों में बदल जाता है। यहाँ गलत हो रहा है?
जेसन

2
यदि आप $sce.trustAsHtmlHTML बनाने के लिए किसी अन्य फ़ंक्शन का उपयोग कर रहे हैं जो इस निर्देश के साथ "संकलित" होगा, तो आपको इसे हटा देना चाहिए। @Apoplexy के लिए धन्यवाद
बुरक टोकक

36

महान उत्तर vkammerer के लिए धन्यवाद। एक अनुकूलन मैं सुझाऊंगा कि संकलन एक बार चलने के बाद अन-देख रहा है। घड़ी अभिव्यक्ति के भीतर $ eval प्रदर्शन निहितार्थ हो सकता है।

    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();
            }
        );
    };
}]);

यहाँ एक कांटा और अपडेटेड फिडेल है।


क्या मुझे इसके लिए इसके विपरीत हो सकता है?
संयम जैन

यह अजाक्स के जवाब में काम नहीं है, लेकिन स्वीकार किए जाते हैं जवाब का काम
foozhan

1
चेतावनी: इस उत्तर के लिए पहेली काम करती है, लेकिन .directive()उत्तर में पोस्ट किए गए कोड में कोड नहीं होता है।
फिल निकोलस

यह एक मेरे लिए काम किया। चुना हुआ उत्तर "त्रुटि: $ rootScope: infdig अनंत $ डाइजेस्ट लूप" को ट्रिगर करेगा
गेब्रियल आंद्रेई

आपको अन्वेषण की आवश्यकता नहीं होनी चाहिए $eval- आप केवल attrs.compileदेखे गए अनाम फ़ंक्शन के स्थान पर सीधे उपयोग कर सकते हैं । यदि आप बस एक स्ट्रिंग अभिव्यक्ति प्रदान करते हैं, तो कोणीय $evalवैसे भी उस पर कॉल करेगा ।
दान राजा

28

इस निर्देश कोणीय को बांधें- html-संकलित करें

.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>

वास्तव में आसान :)


1
सावधान रहें, यदि आप इस तरह से कुछ पास करते हैं: "$ गुंजाइश.loadContent = function () {$ $ sce.trustAsHtml (आवश्यकता ('html / main-content.html'));};" यह करने के लिए आप अनंत पा सकते हैं पाश। TrustAsHtml के बिना यह काम करता है।
लकाटोस ग्यूला

13

दुर्भाग्य से मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है।

मुझे यह उम्र भर काम करने के लिए नहीं मिला। मैंने ng-bind-htmlइस कस्टम निर्देश का उपयोग करने के लिए अपने कोड को संशोधित किया , लेकिन मैं उसे हटाने में विफल रहा $scope.html = $sce.trustAsHtml($scope.html)जो काम करने के लिए एनजी-बाइंड-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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.