注意:当我找到更好的解决方案时,我会更新这个答案。我也保留旧的答案,以备将来参考,只要它们仍然相关。最新最好的答案是第一位的。
更好的回答:
angularjs中的指令非常强大,但是理解它们背后的进程需要时间。
在创建指令时,angularjs允许你创建一个独立的作用域,它带有到父作用域的一些绑定。这些绑定是由DOM中附加元素的属性以及如何在指令定义对象中定义scope属性指定的。
有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>
这里您应该注意的一点是,如果您想设置值字符串,您应该用引号将其括起来。(见第三个输入)
这里有小提琴可以玩: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美元
在当前范围上执行表达式,返回结果。表达式中的任何异常都会被传播(未捕获)。这在计算角度表达式时很有用。