टेम्पलेट के साथ एनजी-शामिल नोड बदलें?


85

कोंडा नया कोणीय। क्या इसमें शामिल टेम्पलेट की सामग्री के साथ एनजी-शामिल नोड को बदलना संभव है ? उदाहरण के लिए, साथ:

<div ng-app>
    <script type="text/ng-template" id="test.html">
        <p>Test</p>
    </script>
    <div ng-include src="'test.html'"></div>
</div>

उत्पन्न HTML है:

<div ng-app>
    <script type="text/ng-template" id="test.html">
        <p>Test</p>
    </script>
    <div ng-include src="'test.html'">
        <span class="ng-scope"> </span>
        <p>Test</p>
        <span class="ng-scope"> </span>
    </div>
</div>

लेकिन मुझे क्या चाहिए:

<div ng-app>
    <script type="text/ng-template" id="test.html">
        <p>Test</p>
    </script>
    <p>Test</p>
</div>

1
'test.html'url के बजाय टेम्पलेट का उपयोग करने के लिए एकल उद्धरण निकालें
charlietfl

1
डॉक्स की टिप्पणियों को एनजी-शामिल के लिए पढ़ना, ऐसा लगता है कि यह स्ट्रिंग के लिए टेम्पलेट के बिना और यूआरएल के बिना स्ट्रिंग के चारों ओर है। इसके अलावा, संबंधित
स्टैक्वोवरफ़्लो

आप डॉक्स पढ़ रहे हैं और आपको पीछे से लिंक किया हुआ पोस्ट करते हैं
charlietfl

जवाबों:


134

मेरे पास यह एक ही मुद्दा था और फिर भी एक गतिशील टेम्पलेट को शामिल करने के लिए एनजी-की सुविधाओं को शामिल करना चाहता था। मैं एक गतिशील बूटस्ट्रैप टूलबार का निर्माण कर रहा था और मुझे सीएसएस शैलियों को ठीक से लागू करने के लिए क्लीनर मार्कअप की आवश्यकता थी।

यहाँ समाधान है कि मैं जो रुचि रखते हैं के लिए आया था:

HTML:

<div ng-include src="dynamicTemplatePath" include-replace></div>

कस्टम निर्देश:

app.directive('includeReplace', function () {
    return {
        require: 'ngInclude',
        restrict: 'A', /* optional */
        link: function (scope, el, attrs) {
            el.replaceWith(el.children());
        }
    };
});

यदि यह समाधान ऊपर के उदाहरण में उपयोग किया गया है, तो गुंजाइश'dy.htmlTemplatePath 'test.html पर सेट करने से वांछित मार्कअप हो जाएगा।




यह कोणीय 1.2.5+ के लिए काम करता है। 1.2.4 के लिए, यदि आपके पास एक एनजी-इन है कि एनजी शामिल है, तो यह विफल रहता है। मैं # 5247 के कारण अनुमान लगा रहा हूं , लेकिन मुझे यकीन नहीं है। खुद के लिए चैंज देखें । यहाँ 1.2.4 के साथ इस समस्या का प्रदर्शन करने वाला प्लंक्र है (कोणीय 1.2.5 में परिवर्तन और इसे देखें काम करता है! :-)
पीटर वी। मॉर्क

9
ध्यान दें कि इस तरह के DOM हेरफेर बहुत हैक किए जाते हैं। समस्या यह है कि यदि शामिल किए गए टेम्पलेट का रूट तत्व एनजी-रिपीट जैसे कुछ का उपयोग करता है। यह DOM में परिणाम नहीं डाल पाएगा।
गुरिया

1
कृपया मेरा उत्तर देखें, यह विफल हो जाएगा क्योंकि प्रीलिंक फ़ंक्शन पहले से ही बच्चे के तत्वों में चलेंगे।
साईं डब्बाका

28

तो @ user1737909 के लिए धन्यवाद, मैंने महसूस किया है कि एनजी-शामिल होने का रास्ता नहीं है। निर्देश बेहतर दृष्टिकोण और अधिक स्पष्ट हैं।

var App = angular.module('app', []);

App.directive('blah', function() {
    return {
        replace: true,
        restrict: 'E',  
        templateUrl: "test.html"
    };
});

Html में:

<blah></blah>

2
धन्यवाद! एक एनजी-शामिल समाधान की तलाश में था लेकिन इससे मुझे यह एहसास हुआ कि निर्देश बेहतर हैं
मैट किम

ध्यान रखें कि replace:trueटेम्प्लेट को डेप्रिसिएशन के लिए चिह्नित किया गया है । मैं पदावनति स्थिति के कारण इस समाधान का उपयोग करने से बचता हूँ।
पीटर वी। मॉर्क

@ पीटरवी.मोर्च धन्यवाद। रुचि रखने वालों के लिए, यह वचनबद्ध है: github.com/angular/angular.js/commit/… । ऐसा लगता है कि यह जटिलता (और शायद अन्य कारणों) के कारण इसे हटा दिया गया था।
सनीसाइडयूपी

15

मुझे एक ही समस्या थी, मेरी तीसरी पार्टी css स्टाइलशीट अतिरिक्त DOM-element को पसंद नहीं करती थी।

मेरा समाधान सुपर-सरल था। बस एनजी शामिल 1 ऊपर ले जाएँ। इसलिए इसके बजाय

<md-sidenav flex class="md-whiteframe-z3" md-component-id="left" md-is-locked-open="$media('gt-md')">
  <div ng-include="myService.template"></span>
</md-sidenav>

मैंने बस किया:

<md-sidenav flex class="md-whiteframe-z3" md-component-id="left" md-is-locked-open="$media('gt-md')" ng-include="myService.template">
</md-sidenav>

मुझे यकीन है कि यह ज्यादातर स्थितियों में काम करेगा, यहां तक ​​कि यह तकनीकी रूप से वह नहीं है जो सवाल पूछ रहा है।


10

एक अन्य विकल्प यह है कि आप अपनी स्वयं की सरल जगह लिखें / निर्देश को शामिल करें

    .directive('myReplace', function () {
               return {
                   replace: true,
                   restrict: 'A',
                   templateUrl: function (iElement, iAttrs) {
                       if (!iAttrs.myReplace) throw new Error("my-replace: template url must be provided");
                       return iAttrs.myReplace;
                   }
               };
           });

यह तब निम्नानुसार उपयोग किया जाएगा:

<div my-replace="test.html"></div>

9

यह बच्चों को बदलने का सही तरीका है

angular.module('common').directive('includeReplace', function () {
    return {
        require: 'ngInclude',
        restrict: 'A',
        compile: function (tElement, tAttrs) {
            tElement.replaceWith(tElement.children());
            return {
                post : angular.noop
            };
        }
    };
});

4
मेरे शामिल किए गए आंशिक HTML में कुछ एनजी-रिपीट हुए, और यह केवल उन्हें हल करने वाला उत्तर है! बहुत बहुत धन्यवाद।
साद बेनबोज़िद

मैं से समारोह सामग्री ले जाने के लिए किया था compileके लिए link, क्योंकि मेरे तत्व संकलन चरण के दौरान खाली था।
itachi

3

निम्नलिखित निर्देश एनजी को शामिल करता है जिसमें मूल निर्देश कार्यक्षमता शामिल है।

यह मूल तत्व को बदलने के लिए एक ईवेंट श्रोता जोड़ता है जब सामग्री तैयार और लोड होती है।

इसे मूल तरीके से उपयोग करें, बस "बदलें" विशेषता जोड़ें:

<ng-include src="'src.html'" replace></ng-include>

या विशेषता संकेतन के साथ:

<div ng-include="'src.html'" replace></div>

यहाँ निर्देश है (निर्भरता के रूप में 'शामिल-प्रतिस्थापित' मॉड्यूल को शामिल करना याद रखें):

angular.module('include-replace', []).directive('ngInclude', function () {
    return {
        priority: 1000,
        link: function($scope, $element, $attrs){

            if($attrs.replace !== undefined){
                var src = $scope.$eval($attrs.ngInclude || $attrs.src);

                var unbind = $scope.$on('$includeContentLoaded', function($event, loaded_src){
                    if(src === loaded_src){
                        $element.next().replaceWith($element.next().children());
                        unbind();
                    };
                });
            }
        }
    };
});

2

मैं @ ब्रैडी आइसोम द्वारा प्रदान किए गए एक से अधिक सुरक्षित समाधान के साथ जाऊंगा।

मैं यह सुनिश्चित करने के लिए onloadदिए गए विकल्प पर भरोसा करना पसंद करता हूं ng-includeकि इसे हटाने की कोशिश करने से पहले टेम्पलेट लोड किया गया है।

.directive('foo', [function () {
    return {
        restrict: 'E', //Or whatever you need
        scope: true,
        template: '<ng-include src="someTemplate.html" onload="replace()"></ng-include>',
        link: function (scope, elem) {
            scope.replace = function () {
                elem.replaceWith(elem.children());
            };
        }
    };
}])

दूसरे निर्देश की कोई आवश्यकता नहीं है क्योंकि सब कुछ पहले वाले के भीतर संभाला जाता है।


सावधान रहें कि कोणीय 1.5 के साथ निर्देशन तत्व में पहला बच्चा एक टिप्पणी है। इसलिए मैंने सुनिश्चित किया कि मुझे एनजी-इन-एलिमेंट मिल जाए और फिर इसे अपने बच्चों के साथ बदल let ngInclude = angular.element( element[ 0 ].querySelector( 'ng-include' ) ); ngInclude.replaceWith( ngInclude.children() );
दूं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.