2013-10-25 85 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