1

我只是觉得我这样做的方式很糟糕,我想知道是否有更好的方法?这是指令:

<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 的依赖。

4

2 回答 2

1

也许最好的方法是:

    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”的重要性。仅使用“模板”,错误就消失了。

于 2013-10-26T00:01:56.117 回答
1

Angular 1.2 RC2 或者 RC3 用属性插值破坏了一些东西。请参阅我提交的此错误:

https://github.com/angular/angular.js/issues/4525

今天刚刚修好。你永远不应该在你的值中看到双花括号,这是一个错误。

但是,一旦发现一个属性使用插值,它的评估就会变得异步。即使修复了这个错误,您也应该看到它的同步值undefined(即,如果您只是从 $attrs 中读取该值)。这就是你必须 $observe 的原因,所以价值一可用就会交给你。

至于为什么它不能立即可用,它是动态的。对的评价{{val}}可能一直都不一样。这就是 Angular 的本质,一切都在实时更新。

于 2013-10-26T03:58:04.517 回答