2014-12-30 94 views
11

我學習AngularJS指令AngularJS指令,並有一件事我想要做的是通過在父scope(一controllerscope)一些變量$scope.message,我希望它被重命名爲param裏面的directivealert。我可以用一個孤立的範圍做到這一點:傳遞變量沒有隔離範圍

<div alert param="message"></div> 

,並定義

.directive("alert", function(){ 
    return{ 
     restrict: "A", 
     scope: { 
      param: "=" 
     }, 
     link: function(scope){ 
      console.log(scope.param) # log the message correctly 
     } 
    } 
}) 

但我可以做到這一點,而無需使用隔離範圍是什麼?假設我想另一個directivetoast添加到<div toast alert></div>並使用相同的param(保持2路數據綁定),天真的我會做

.directive("toast", function(){ 
    return{ 
     restrict: "A", 
     scope: { 
      param: "=" 
     }, 
     link: function(scope){ 
      console.log(scope.param) 
     } 
    } 
}) 

我一定會得到一個錯誤Multiple directives [alert, toast] asking for new/isolated scope on:<div...

所以總之,我的問題是,如何在沒有隔離範圍的情況下重命名父範圍變量,以及如何在兩個directives放置在單個DOM上時共享變量?

+0

你想要2個指令綁定到相同的父'$ scope'屬性嗎? –

回答

13

修改你的麪包指令:

.directive("toast", function(){ 
    return{ 
     restrict: "A", 
     link: function(scope, elem, attrs){ 
      var param = scope.$eval(attrs.param); 
      console.log(param) 
     } 
    } 
}) 

Example fiddle。由於吐司現在與父母所在的範圍相同(如果它被允許爲隔離範圍),則可以使用param屬性簡單地調用$ eval來獲取該值。

+0

謝謝,完美無缺!我應該看看'$ eval()'文檔。 – Lelouch

+0

$ eval()是否返回值或實際提供數據綁定?它似乎只返回價值,但我想確保。 – Lelouch

+1

這只是價值。如果你需要模擬綁定,你可以使用$ watch ...我相信這可能是矯枉過正,因爲你只需再次獲得$ eval就可以獲得最近的值(例如在某個ngEvent上)。 – Patrick