Angular JS将子范围变量传播到父范围

Mic*_*ins 47 angularjs

尽管在ChildCtrl中实例化了一个"new"var,我怎样才能进行变量并轻松地将它们传播回ParentCtrl?最小到没有$ on和$ watch的额外积分(使其更容易实现)

ParentCtrl

  • ChildCtrl/ChildCtrl2/ChildCtrl3/ChildCtrl4

    • 视图

我的ChildCtrl是不同的,我不能轻易地抽象主布局和ng视图,但它们都依赖于ParentCtrl中的相同功能.

$ scope.searchTerms在ParentCtrl中定义,但带有ng-model ='searchTerms'的输入框位于子控制器的视图中.当这个var改变时,它不会在ParentCtrl中反映出ChildCtrls.

示例:http: //jsfiddle.net/JHwxP/22/

HTML部分

<div ng-app>
    <div ng-controller="Parent">
        parentX = {{x}} <br/>
        parentY = {{y}}<br/>
        <div ng-controller="Child">
            childX = {{x}}<br/>
            childY = {{y}}<br/>
            <a ng-click="modifyBothScopes()">modifyBothScopes</a><br>
            <br>
            The changes here need to appear in 'Parent'. <input ng-model='y'>
        </div>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

控制器

function Parent($scope) {
    $scope.x= 5;
    $scope.y= 5;
}

function Child($scope) {
    $scope.modifyBothScopes= function() {
       $scope.$parent.x++;
    };  
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

我目前正在尝试共享服务方法:https://gist.github.com/exclsr/3595424

UPDATE

尝试发射/广播系统

已解决问题:我在父级中存储了$ scope.searchTerms,并且在更改时在子$ scope中创建了一个空格.

解决方案:我应该在父级中完成$ scope.search.terms,当在子级中更改时,它会冒泡到父级.

示例:http://jsfiddle.net/JHwxP/23/

sat*_*run 87

这是由于原型继承的工作原理.

当您$scope.x在子控制器中请求时,它会检查是否在其作用域中定义了x,如果没有,则在父作用域中查找x.

如果分配给子范围的x属性,则它仅修改子范围.

处理此问题并获得共享行为的简单方法是使用对象或数组.

function ParentCtrl($scope) {
  $scope.model = {x: 5, y: 5};
}

function ChildCtrl($scope) {
  $scope.update = function(x, y) {
    $scope.model.x = x;
    $scope.model.y = y;
  };
}
Run Code Online (Sandbox Code Playgroud)

这里,更改将在两个范围中都可见,因为$scope.model它将在父范围和子范围中引用相同的对象.

John Lindquist有一个视频.

  • 我知道Misko的"如果你没有使用点,那你就做错了." 说话,但我从未体验过为什么.以下是您的答案的工作示例:http://jsfiddle.net/JHwxP/23/ (9认同)

rtc*_*rry 14

另一个不涉及创建通过引用传递的对象的解决方案是在父控制器中创建setter函数.

function ParentCtrl($scope) {
  $scope.x = 5;
  $scope.y = 5;

  $scope.setX = function(value) {
    $scope.x = value;
  }

  $scope.setY = function(value) {
    $scope.y = value;
  }
}

function ChildCtrl($scope) {
  $scope.update = function(x, y) {
    $scope.setX(x);
    $scope.setY(y);
  };
}
Run Code Online (Sandbox Code Playgroud)

当数据成为同一对象的一部分可能没有意义时,我觉得这更清洁.

你也可能发疯了,在孩子身上做这样的事情:

function ChildCtrl($scope) {
  var superSetX = $scope.setX;
  $scope.setX = function(value) {
    superSetX(value * 2);
  };
  ...
}
Run Code Online (Sandbox Code Playgroud)