我只是觉得我这样做的方式很糟糕,我想知道是否有更好的方法?这是指令:
<myDirective myAttribute="{{val}}"></myDirective>
这是指令的控制器:
.controller('myDirective', ['$scope', '$attrs', function ($scope, $attrs) {
$attrs.$observe('my-attribute', function (x) {
$scope.myAttribute = x; // yay we finally have the interpolated value...
});
这很糟糕,原因有很多我不想进入。 有没有办法确保在调用控制器之前解析内插值?
理想情况下,调用控制器初始值设定项时,$scope.myAttribute 将具有内插值。
编辑:我的主要目标是摆脱对$attrs的依赖,该控制器具有
Angular 1.2 RC2 或 RC3 通过属性插值破坏了一些东西。看到我提交的这个错误:
https://github.com/angular/angular.js/issues/4525
今天刚刚修复。你永远不应该在你的值中看到双花括号,这是一个错误。
但是,一旦发现属性使用插值,其评估就会变为异步。即使修复了此错误,您也应该看到它的同步值为undefined
(即,如果您只是从$attrs中读取该值)。这就是为什么你必须$observe,所以价值会在可用时立即交给你。
至于为什么它不能立即可用,它是动态的。对{{val}}
的评估可能一直不同。这就是Angular的本质,一切都在不断更新。
也许最好的方法是:
link: function (scope, element, attrs) {
attrs.$observe('myAttribute', function(x) {
scope.setMyAttribute(x);
});
}
然后:
.controller('myDirective', ['$scope', function ($scope) {
$scope.setMyAttribute = function (x) {
$scope.myAttribute = x; // yay we finally have the interpolated value...
});
编辑:这需要一些工作...这是一个演示此错误的 plunker:
http://plnkr.co/edit/p46zuYbFAFCYH394zrUY?p=preview
请注意在子指令中使用"templateUrl"的重要性。 仅使用"模板",错误就会消失。