แจ้งให้ทราบล่วงหน้า: ฉันจะปรับปรุงคำตอบนี้ในขณะที่ฉันหาทางออกที่ดี ฉันยังเก็บคำตอบเก่าไว้สำหรับใช้อ้างอิงในอนาคตตราบใดที่ยังมีความเกี่ยวข้องอยู่ คำตอบล่าสุดและดีที่สุดมาก่อน
คำตอบที่ดีกว่า:
คำสั่งในเชิงมุมมีพลังมาก แต่ต้องใช้เวลาในการทำความเข้าใจว่ากระบวนการใดอยู่เบื้องหลังพวกเขา
ขณะสร้างคำสั่ง angularjs ให้คุณสร้างขอบเขตที่แยกได้ซึ่งมีการเชื่อมโยงกับขอบเขตพาเรนต์ ผูกเหล่านี้จะถูกระบุโดยแอตทริบิวต์คุณแนบองค์ประกอบใน 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";
});
HTML
<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
เป็นบริการที่ไม่ได้อยู่ในคุณสมบัติของขอบเขตปัจจุบันซึ่งหมายความว่าจะใช้เวลาเพียงการแสดงออกเชิงมุมและไม่สามารถเข้าถึงขอบเขต
{{
, }}
การแสดงออกที่ถูกรวบรวมไว้ในขณะที่ angularjs เริ่มต้นซึ่งหมายความว่าเมื่อเราพยายามเข้าถึงพวกเขาในแนวทางของเรา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>
สิ่งหนึ่งที่คุณควรสังเกตที่นี่คือถ้าคุณต้องการตั้งค่าสตริงคุณควรตัดมันด้วยเครื่องหมายคำพูด (ดูอินพุต 3)
นี่คือซอที่จะเล่นกับ: 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
เรียกใช้งานนิพจน์บนขอบเขตปัจจุบันที่ส่งคืนผลลัพธ์ ข้อยกเว้นใด ๆ ในนิพจน์นั้นเผยแพร่ (ไม่ถูกตรวจจับ) สิ่งนี้มีประโยชน์เมื่อประเมินนิพจน์เชิงมุม