सूचना: मैं इस उत्तर को अपडेट करता हूं क्योंकि मुझे बेहतर समाधान मिलते हैं। जब तक वे संबंधित रहेंगे तब तक मैं भविष्य के संदर्भ के लिए पुराने उत्तर भी रखूंगा। नवीनतम और सबसे अच्छा जवाब पहले आता है।
बेहतर जवाब:
कोणीयज में निर्देश बहुत शक्तिशाली हैं, लेकिन यह समझने में समय लगता है कि कौन सी प्रक्रिया उनके पीछे पड़ी है।
निर्देशों का निर्माण करते समय, कोणीयज आपको कुछ अलग-अलग बाइंडिंग के साथ पैरेंट स्कोप बनाने की अनुमति देता है। ये बाइंडिंग उस विशेषता द्वारा निर्दिष्ट की जाती हैं जिसे आप DOM में तत्व देते हैं और आप निर्देश परिभाषा ऑब्जेक्ट में स्कोप प्रॉपर्टी को कैसे परिभाषित करते हैं ।
बाध्यकारी प्रकार के 3 विकल्प हैं जिन्हें आप दायरे में परिभाषित कर सकते हैं और आप उन्हें उपसर्ग संबंधित विशेषता के रूप में लिख सकते हैं।
angular.module("myApp", []).directive("myDirective", function () {
return {
restrict: "A",
scope: {
text: "@myText",
twoWayBind: "=myTwoWayBind",
oneWayBind: "&myOneWayBind"
}
};
}).controller("myController", function ($scope) {
$scope.foo = {name: "Umur"};
$scope.bar = "qwe";
});
एचटीएमएल
<div ng-controller="myController">
<div my-directive my-text="hello {{ bar }}" my-two-way-bind="foo" my-one-way-bind="bar">
</div>
</div>
उस मामले में, निर्देश के दायरे में (चाहे वह लिंकिंग फ़ंक्शन या नियंत्रक में हो), हम इन गुणों को इस तरह एक्सेस कर सकते हैं:
/* Directive scope */
in: $scope.text
out: "hello qwe"
// this would automatically update the changes of value in digest
// this is always string as dom attributes values are always strings
in: $scope.twoWayBind
out: {name:"Umur"}
// this would automatically update the changes of value in digest
// changes in this will be reflected in parent scope
// in directive's scope
in: $scope.twoWayBind.name = "John"
//in parent scope
in: $scope.foo.name
out: "John"
in: $scope.oneWayBind() // notice the function call, this binding is read only
out: "qwe"
// any changes here will not reflect in parent, as this only a getter .
"फिर भी ठीक है" उत्तर:
चूंकि यह उत्तर स्वीकार कर लिया गया है, लेकिन कुछ मुद्दे हैं, मैं इसे बेहतर तरीके से अपडेट करने जा रहा हूं। जाहिरा तौर पर, $parse
एक ऐसी सेवा है जो वर्तमान दायरे के गुणों में झूठ नहीं है, जिसका अर्थ है कि यह केवल कोणीय अभिव्यक्ति लेता है और गुंजाइश तक नहीं पहुंच सकता है।
भावों को संकलित करते समय संकलित किया जाता है {{
, }}
जिसका अर्थ है कि जब हम अपने निर्देशों की postlink
पद्धति में उन्हें एक्सेस करने का प्रयास करते हैं, तो वे पहले से ही संकलित होते हैं। ( {{1+1}}
है 2
पहले से ही निर्देश में)।
यह आप कैसे उपयोग करना चाहते हैं:
var myApp = angular.module('myApp',[]);
myApp.directive('myDirective', function ($parse) {
return function (scope, element, attr) {
element.val("value=" + $parse(attr.myDirective)(scope));
};
});
function MyCtrl($scope) {
$scope.aaa = 3432;
}
।
<div ng-controller="MyCtrl">
<input my-directive="123">
<input my-directive="1+1">
<input my-directive="'1+1'">
<input my-directive="aaa">
</div>
एक बात जो आपको यहाँ देखनी चाहिए वह यह है कि, यदि आप मान स्ट्रिंग सेट करना चाहते हैं, तो आपको इसे उद्धरणों में लपेटना चाहिए। (तीसरा इनपुट देखें)
यहाँ खेलने के लिए पहेली है : http://jsfiddle.net/neuTA/6/
पुराना उत्तर:
मैं उन लोगों के लिए इसे नहीं हटा रहा हूं जिन्हें मेरी तरह गुमराह किया जा सकता है, ध्यान दें कि इसका उपयोग करने $eval
का सही तरीका बिल्कुल ठीक है, लेकिन $parse
एक अलग व्यवहार है, आपको ज्यादातर मामलों में उपयोग करने के लिए संभवतः इसकी आवश्यकता नहीं होगी।
इसे करने का तरीका, एक बार फिर से, का उपयोग करना है scope.$eval
। न केवल यह कोणीय अभिव्यक्ति को संकलित करता है, इसमें वर्तमान क्षेत्र के गुणों तक भी पहुंच है।
var myApp = angular.module('myApp',[]);
myApp.directive('myDirective', function () {
return function (scope, element, attr) {
element.val("value = "+ scope.$eval(attr.value));
}
});
function MyCtrl($scope) {
}
आप जो याद कर रहे थे वह था $eval
।
http://docs.angularjs.org/api/ng.$rootScope.Scope#$eval
परिणाम लौटाने वाले मौजूदा दायरे पर अभिव्यक्ति का निष्पादन करता है। अभिव्यक्ति में कोई भी अपवाद प्रचारित (अनकैप्ड) है। कोणीय अभिव्यक्तियों का मूल्यांकन करते समय यह उपयोगी है।