AngularJS 指令控制器解析插值属性



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

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

最新更新