मैं एक तत्व में 2 टेम्पलेट्स इंजेक्षन और उन पर संचालित करने के लिए कोशिश कर रहा हूँ:AngularJS: एक ही तत्व पर ट्रांसक्लुजन के साथ कई निर्देशों
<div
ic-first="foo"
ic-second="bar"
ic-third="baz"
ic-fourth="qux"
>
</div>
icFirst के एक बच्चे के रूप में एक खाली div टेम्प्लेट के माध्यम से इंजेक्षन चाहिए इसका तत्व icSecond अपने तत्व के दूसरे बच्चे के रूप में (सामग्री के एक समूह के साथ) एक दूसरे div इंजेक्षन चाहिए, ताकि परिणामस्वरूप एचटीएमएल दिखाई देगा:
<div
ic-first="foo" // priority: 100
ic-second="bar" // priority: 50
ic-third="baz" // priority: 0
ic-fourth="qux" // priority: 0
>
<div id="foo"></div>
<div> <!-- a bunch of stuff from the templateUrl --> </div>
</div>
दोनों icFirst और icSecond इंजेक्षन जाएगा अन्य तत्वों नव निर्मित कंटेनरों में।
जब मैं दोनों के निर्देशों पर एक निर्देश टेम्पलेट संपत्ति निर्दिष्ट करते हैं, मैं कोई त्रुटि मिलती है: जब मैं दोनों निर्देशों को transclude: true
जोड़ने
Error: Multiple directives [icFirst, icSecond] asking for template on:
<div ic-first
…
, icFirst ठीक निष्पादित करता है ... लेकिन फिर उसी पर अन्य निर्देशों तत्व निष्पादित नहीं किया जाता है। जब मैं transclude: 'element'
सेट करता हूं, तो अन्य निर्देश निष्पादित करते हैं लेकिन मुझे एक त्रुटि मिलती है कि पहला बच्चा ($scope.firstObj
) अपरिभाषित है।
सभी चार निर्देशों एक दूसरे की गुंजाइश के लिए उपयोग की जरूरत है, तो मैं अपने अधिकतर कार्य कर रहा हूँ अपने नियंत्रकों में:
app.directive('icFirst', ['ic.config', function (icConfig) {
return {
restrict: 'A',
priority: 100,
template: '<div id="{{firstId}}"></div>',
replace: false,
transclude: 'element',
controller: function icFirst($scope, $element, $attrs) {
// …
$scope.firstId = $scope.opts.fooId;
$scope.firstElm = $element.children()[0];
$scope.firstObj = {}; // this is used by the other 3 directives
},
link: function(scope, elm, attrs) { … } // <- event binding
}
);
app.directive('icSecond', ['ic.config', function (icConfig) {
return {
restrict: 'A',
priority: 0,
templateUrl: 'views/foo.html',
replace: false,
transclude: 'element',
controller: function icSecond($scope, $element, $attrs) {
// …
$scope.secondElm = $element.children()[1];
$scope.secondObj = new Bar($scope.firstObj);
//^is used by the remaining 2 directives & requires obj from icFirst
},
link: function(scope, elm, attrs) { … } // <- event binding
}
);
नोट मैं प्रलेखित व्यवहार से मेल करने के replace: false
के व्यवहार को सही है, जैसा पुल अनुरोध #2433 में वर्णित है।
मैंने नियंत्रक में $scope.firstObj
को तुरंत चालू करने की कोशिश की, और इसे लिंकएफएन में स्थापित करने की उम्मीद की (उम्मीद है कि रूपांतरण निष्पादन के समय तक पूरा हो जाएगा), लेकिन मुझे एक ही समस्या मिलती है। ऐसा लगता है कि पहला बच्चा वास्तव में एक टिप्पणी है।
अब एक आसान तरीका है।बस अपने निर्देश के लिए '$$ tlb: true' जोड़ें और यह जोर से बाईपास करेगा। –
@ जोनाथनराउन '$$' इंगित करता है कि '$$ tlb' एपीआई के लिए 'निजी' है और एपीआई के बाहर इसका उपयोग नहीं किया जाना चाहिए, क्योंकि देव किसी भी समय इसे तोड़ने का फैसला कर सकते हैं। –