प्रतीक्षा करें जब तक कोणीय ने चर का मूल्यांकन नहीं किया
मेरे पास इसके साथ बहुत सी फ़िदालिंग थी, और इसे "="
दायरे में परिभाषित चर के साथ भी काम करने के लिए नहीं मिला । यहां आपकी स्थिति के आधार पर तीन समाधान दिए गए हैं।
समाधान # 1
मैंने पाया कि चर का मूल्यांकन कोणीय द्वारा अभी तक नहीं किया गया था था जब इसे निर्देश के पास किया गया था। इसका मतलब है कि आप इसे एक्सेस कर सकते हैं और इसे टेम्प्लेट में उपयोग कर सकते हैं, लेकिन लिंक या ऐप कंट्रोलर फ़ंक्शन के अंदर नहीं जब तक कि हम इसके मूल्यांकन का इंतजार नहीं करते।
यदि आपका चर बदल रहा है , या एक अनुरोध के माध्यम से लाया जाता है, तो आपको इसका उपयोग करना चाहिए $observe
या $watch
:
app.directive('yourDirective', function () {
return {
restrict: 'A',
// NB: no isolated scope!!
link: function (scope, element, attrs) {
// observe changes in attribute - could also be scope.$watch
attrs.$observe('yourDirective', function (value) {
if (value) {
console.log(value);
// pass value to app controller
scope.variable = value;
}
});
},
// the variable is available in directive controller,
// and can be fetched as done in link function
controller: ['$scope', '$element', '$attrs',
function ($scope, $element, $attrs) {
// observe changes in attribute - could also be scope.$watch
$attrs.$observe('yourDirective', function (value) {
if (value) {
console.log(value);
// pass value to app controller
$scope.variable = value;
}
});
}
]
};
})
.controller('MyCtrl', ['$scope', function ($scope) {
// variable passed to app controller
$scope.$watch('variable', function (value) {
if (value) {
console.log(value);
}
});
}]);
और यहाँ html (कोष्ठक याद रखें!):
<div ng-controller="MyCtrl">
<div your-directive="{{ someObject.someVariable }}"></div>
<!-- use ng-bind in stead of {{ }}, when you can to avoids FOUC -->
<div ng-bind="variable"></div>
</div>
ध्यान दें कि "="
यदि आप $observe
फ़ंक्शन का उपयोग कर रहे हैं, तो आपको चर को दायरे में सेट नहीं करना चाहिए । इसके अलावा, मैंने पाया कि यह वस्तुओं को तार के रूप में पास करता है, इसलिए यदि आप वस्तुओं को पास कर रहे हैं तो समाधान # 2 या scope.$watch(attrs.yourDirective, fn)
(या # 3) का उपयोग करें यदि आपका वेरिएबल नहीं बदल रहा है)।
समाधान # 2
यदि आपका वैरिएबल किसी अन्य नियंत्रक में बनाया गया है , लेकिन बस तब तक प्रतीक्षा करने की आवश्यकता है, जब तक कोणीय ने ऐप नियंत्रक को भेजने से पहले इसका मूल्यांकन नहीं कर लिया हो, हम $timeout
तब तक इंतजार कर सकते हैं जब तक कि $apply
यह चला नहीं गया है। इसके अलावा, हमें $emit
इसे पेरेंट स्कोप ऐप कंट्रोलर (निर्देश में अलग-अलग स्कोप के कारण) को भेजने के लिए उपयोग करने की आवश्यकता है :
app.directive('yourDirective', ['$timeout', function ($timeout) {
return {
restrict: 'A',
// NB: isolated scope!!
scope: {
yourDirective: '='
},
link: function (scope, element, attrs) {
// wait until after $apply
$timeout(function(){
console.log(scope.yourDirective);
// use scope.$emit to pass it to controller
scope.$emit('notification', scope.yourDirective);
});
},
// the variable is available in directive controller,
// and can be fetched as done in link function
controller: [ '$scope', function ($scope) {
// wait until after $apply
$timeout(function(){
console.log($scope.yourDirective);
// use $scope.$emit to pass it to controller
$scope.$emit('notification', scope.yourDirective);
});
}]
};
}])
.controller('MyCtrl', ['$scope', function ($scope) {
// variable passed to app controller
$scope.$on('notification', function (evt, value) {
console.log(value);
$scope.variable = value;
});
}]);
और यहाँ html (कोई कोष्ठक नहीं है!):
<div ng-controller="MyCtrl">
<div your-directive="someObject.someVariable"></div>
<!-- use ng-bind in stead of {{ }}, when you can to avoids FOUC -->
<div ng-bind="variable"></div>
</div>
समाधान # 3
यदि आपका चर नहीं बदल रहा है और आपको अपने निर्देश में इसका मूल्यांकन करने की आवश्यकता है, तो आप $eval
फ़ंक्शन का उपयोग कर सकते हैं :
app.directive('yourDirective', function () {
return {
restrict: 'A',
// NB: no isolated scope!!
link: function (scope, element, attrs) {
// executes the expression on the current scope returning the result
// and adds it to the scope
scope.variable = scope.$eval(attrs.yourDirective);
console.log(scope.variable);
},
// the variable is available in directive controller,
// and can be fetched as done in link function
controller: ['$scope', '$element', '$attrs',
function ($scope, $element, $attrs) {
// executes the expression on the current scope returning the result
// and adds it to the scope
scope.variable = scope.$eval($attrs.yourDirective);
console.log($scope.variable);
}
]
};
})
.controller('MyCtrl', ['$scope', function ($scope) {
// variable passed to app controller
$scope.$watch('variable', function (value) {
if (value) {
console.log(value);
}
});
}]);
और यहाँ html (कोष्ठक याद रखें!):
<div ng-controller="MyCtrl">
<div your-directive="{{ someObject.someVariable }}"></div>
<!-- use ng-bind instead of {{ }}, when you can to avoids FOUC -->
<div ng-bind="variable"></div>
</div>
इसके अलावा, इस उत्तर पर एक नज़र डालें: https://stackoverflow.com/a/12372494/1008519
FOUC (अस्थिर सामग्री की फ़्लैश) समस्या के लिए संदर्भ: http://deansofer.com/posts/view/14/AngularJs-Tips-and-Tricks-UPDATED
रुचि के लिए: यहाँ कोणीय जीवन चक्र पर एक लेख है