2013-10-25 157 views
1

我只是觉得我这样做很糟糕,而且我想知道是否有更好的方法? 这里的指令: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的依赖。

回答

1

角1.2 RC2或可能RC3打破了一些属性插值的东西。看到这个错误我申请:

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

刚刚得到了今天的固定。你应该从来没有看到你的价值双花括号,这是一个错误。

但是,只要发现属性使用插值,评估就会变为异步。即使修正了这个错误,您也应该看到它的同步值为undefined(即,如果您刚刚从$ attrs中读取值)。这就是为什么你必须观察,所以一旦有价值就会把价值交给你。

至于为什么它不能立即可用,它是动态的。 {{val}}的评估可能会一直不同。这就是Angular的本质,所有事情都会随时更新。

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

注意imp在子指令中使用“templateUrl”。只使用“模板”和错误消失。

+0

除了一些奇怪的原因,链接函数中的$ observe返回x = {{val}}而不是内插的val。任何帮助? – JayPrime2012

+0

似乎attrs与$ attrs不一样。 – JayPrime2012

+0

我读的源代码和attrs是相同的$ attrs。我不知道为什么移动attrs。$ observe()调用链接函数会导致插值失败,x的值始终是{{val}},而不是val的插值值。 – JayPrime2012