parent.parent 范围的双向绑定

Two-way binding with parent.parent scope

我遇到一个问题,其中具有隔离作用域的指令未通过绑定到其 parent.parent 作用域进行更改。

总而言之,我希望在指令的隔离作用域中对绑定到父 属性 的 属性 所做的更改会一直传播到该 [=84] 的父作用域=](属性 是从 parent.parent 作用域开始继承的),但事实并非如此。它只更改直接父作用域的值,而 parent.parent 作用域具有旧值。更糟糕的是,对 parent.parent 作用域 属性 的任何更改都不再渗透到隔离作用域或其直接父级。我知道这是 Javascript 原型继承的正常行为,Angular 作用域是建立在原型继承之上的,但是在这种双向数据绑定的情况下不需要它,我正在寻找解决方案Angular.

这是一个行为示例:http://jsfiddle.net/abeall/RmDuw/344/

我的HTML包含一个控制器div(MyController1),里面是另一个控制器div(MyController2),里面是一个指令(MyDirective):

<div ng-controller="MyController">
    <p>MyController1: {{myMessage}} <button ng-click="change()">change</button></p>
    <div ng-controller="MyController2">
        <p>MyController2: {{myMessage}} <button ng-click="change()">change</button></p>
        <p>MyDirective: <my-directive message="myMessage"/></p>
    </div>
</div>

Javascript 在外部 MyController 作用域上定义 myMessage,内部 MyController2 作用域继承并绑定 myMessagemessage指令,并且 MyDirectivemessage 定义为隔离范围 属性。在每一层都定义了一个 change() 函数来改变本地消息 属性:

var app = angular.module('myApp', []);

function MyController($scope) {
    var count = 0;
    $scope.myMessage = "from controller";
    $scope.change = function(){
        $scope.myMessage = "from controller one " + (++count);
    }
}

function MyController2($scope) {
    var count = 0;
    $scope.change = function(){
        $scope.myMessage = "from controller two " + (++count);
    }
}

app.directive('myDirective', function() {
    return {
        restrict: 'E',
        replace: true,
        template: '<span>Hello {{message}} <button ng-click="change()">change</button></span>',
        scope: {
            message: "="
        },
        link: function(scope, elm, attrs) {
            var count = 0;
            scope.change = function(){
                scope.message = "from directive " + (++count);
            }
        }
    };
});

您会注意到:

所以我的问题是:

如@Claies 所述,使用 controller as 是个好主意。通过这种方式,您可以直接了解要更新的范围,也可以轻松地在方法中传递范围。

Here is a fiddle of the results you were likely expecting

语法:ng-controller="MyController as ctrl1"

然后里面:{{ctrl1.myMessage}}ng-click="ctrl1.change()"click="ctrl2.change(ctrl1)"

这通过省略 $scope 依赖项来改变您编写控制器的方式,除非您出于其他原因需要它然后持有您的模型。

function MyController () {
  var count = 0
  this.myMessage = "from controller"
  this.change = function () {
    this.myMessage = "from controller one " + (++count)
  }
}

function MyController2 () {
  var count = 0
  this.change = function (ctrl) {
    ctrl.myMessage = "from controller two " + (++count)
  }
}

最简单的更改是在根控制器中使用 $scope.msg.mymessage 而不是 $scope.msg。

function MyController($scope) {
    var count = 0;
    $scope.msg = {};
    $scope.msg.myMessage = "from controller";
    $scope.change = function(){
        $scope.msg.myMessage = "from controller one " + (++count);
    }
}

这是一个带有预期结果的分支 fiddle(听起来很有趣)。

http://jsfiddle.net/nk5cdrmx/