2014-12-30 92 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