问题 将变量传递给AngularJS指令而不使用隔离范围


我正在学习AngularJS指令,我想做的一件事就是传递一些变量 $scope.message 在父母 scope (一个 scope 一个 controller),我想将它重命名为 param 在 - 的里面 directive  alert。我可以用一个孤立的范围做到这一点:

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

并定义

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

但是,如果不使用隔离范围,我可以这样做吗假设我想添加另一个 directive  toast 到了 <div toast alert></div> 并利用相同的 param (保持双向数据绑定),天真地我会这样做

.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


7576
2017-12-30 17:29


起源

您是否希望将2个指令绑定到同一个父级 $scope 属性? - Davin Tryon


答案:


修改吐司指令:

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

示例小提琴

由于toast现在与父级所在的范围相同(如果允许它是隔离范围),您只需使用param属性调用范围上的$ eval即可获取值。


14
2017-12-30 17:36



谢谢,完美的工作!我应该看看 $eval() 然后是docs。 - Lelouch
$ eval()只是返回值还是实际提供数据绑定?它似乎只返回值,但我想确定。 - Lelouch
这只是价值。如果你需要模拟绑定,你可以使用$ watch ...我相信这可能是矫枉过正的,因为你只需再次获得$ eval以获得最新值(例如某些ngEvent)。 - Patrick