其他分享
首页 > 其他分享> > 我在角度指令之外正确共享了状态? (父范围/ $rootScope问题)

我在角度指令之外正确共享了状态? (父范围/ $rootScope问题)

作者:互联网

我页面上有两个没有以某种方式嵌套的元素.在第一个属性上,我要设置第二个属性的内容,如下所示:

<body>
    <input info="This is some info"></input>
    <div>{{info}}</div>
</body>

我知道可以按照“ AngularJS – Attribute directive input value change”中所述进行类似的操作,但是在我的情况下,属性的内容是modelvalue.而且,我已经在使用ng-model来处理输入的值.

最后,我像这样解决了这个问题:

<body>
    <input infobox info="This is some info"></input>
    <div>{{info}}</div>
</body>
app.directive('infobox', function() {
    return {
        restrict : 'A',
        scope : {
            info : '@info'
        },
        controller: function($rootScope, $scope) {
            $rootScope.info = $scope.info;
        }
    };
});

jsfiddle

因此,我通过直接转到$rootScope来绕过任何孤立的范围来传递值,但感觉像是在解决问题.从本质上讲,我不知道哪个控制器或作用域可能在链上,因为我需要能够在任何地方使用此组件.

另一种解决方案是为整个页面设置一个父控制器,但这又仅仅是伪根作用域.另一个更麻烦的解决方案是拥有两个指令或控制器,并使用类似于总线的事件进行通信.可以,但是我们不要这样做.

有没有一种“干净”的方法来做到这一点?

/编辑

这是一个应该有效的干净解决方案(在jsfiddle中它可以做到):

<body>
     <div info="this is some info"></div>
     <div>{{info}}</div>
</body>
app.directive('info', function() {
    return {
        restrict : 'A',
        link: function(scope, element, attrs, ngModel) {
            scope.info = attrs.info;
        }
    };
});

jsfiddle.

然而,在我的现实生活中,价值固守在链中的某处.具有隔离范围的父指令是否有可能一直阻塞级联?

/ edit2

我认为这肯定是可行的解决方案.它涉及三个指令,其中一个是彼此的父母.注释中建议的解决方案的组合:

jsfiddle

但是,在我自己的代码中,它仍然不起作用.看起来似乎很简单,但infoManager.info仍未定义.

解决方法:

我最近在类似情况下使用了另一种方法(也确实使用“ rootscope越狱”和“事件发出/侦听”模式来解决其他问题)可能对您有用:可以说我们有此指令:

app.directive('infobox', function() {
    return {
        restrict : 'A',
        scope : {
            info : '@info'
        },
        controller: function($rootScope, $scope) {
            //$rootScope.info = $scope.info;
            this.setInfo = function(data){
              $scope.info = data;
            }
            this.getInfo = function(){
                return $scope.info;
            }

        }
    };
})

现在,我可以添加另一个指令来显示{{info}}:

与html:

app.directive('showinfo', function(){
   return {
    restrict:'A',
    template:'<div>{{info}}</div>',
    require:'^infobox', //this is where the magic happens
    link:function(scope,element,attrs,parentCtrl){ //notice that now er have a "parentctrl, with everything that is on 'this' in the required direcive
//you can set a watch for this etc..
  scope.info = parentCtrl.getInfo();
  }

 }

})

希望这可以帮助!

标签:angularjs-controller,angularjs,angularjs-directive,angularjs-scope,javascript
来源: https://codeday.me/bug/20191030/1964708.html