相关疑难解决方法(0)

AngularJS中控制器之间通信的正确方法是什么?

控制器之间通信的正确方法是什么?

我目前正在使用一种可怕的软糖包括window:

function StockSubgroupCtrl($scope, $http) {
    $scope.subgroups = [];
    $scope.handleSubgroupsLoaded = function(data, status) {
        $scope.subgroups = data;
    }
    $scope.fetch = function(prod_grp) {
        $http.get('/api/stock/groups/' + prod_grp + '/subgroups/').success($scope.handleSubgroupsLoaded);
    }
    window.fetchStockSubgroups = $scope.fetch;
}

function StockGroupCtrl($scope, $http) {
    ...
    $scope.select = function(prod_grp) {
        $scope.selectedGroup = prod_grp;
        window.fetchStockSubgroups(prod_grp);
    }
}
Run Code Online (Sandbox Code Playgroud)

scope angularjs

470
推荐指数
9
解决办法
21万
查看次数

Angular中控制器之间的通信

我熟悉以下方法来实现控制器之间的通信.

还有其他人吗?有更好的方法/最佳实践吗?


$broadcast/$emit

.controller("Parent", function($scope){
  $scope.$broadcast("SomethingHappened", {..});
  $scope.$on("SomethingElseHappened", function(e, d){..});
})
.controller("Child", functions($scope){
  $scope.$broadcast("SomethingElseHappened", {..});
  $scope.$on("SomethingHappened", function(e, d){..});
})
.controller("AnotherChild", functions($scope){
  $scope.$on("SomethingHappened", function(e, d){..});
});
Run Code Online (Sandbox Code Playgroud)

或者,从视图:

<button ng-click="$broadcast('SomethingHappened', data)">Do Something</button>
Run Code Online (Sandbox Code Playgroud)

好处:

  • 适合一次性活动

缺点:

  • 兄弟姐妹之间的不工作,除非一个共同的祖先一样$rootScope,使用


范围继承函数

<div ng-controller="Parent">
  <div ng-controller="Child">
    <div ng-controller="ChildOfChild">
       <button ng-click="someParentFunctionInScope()">Do</button>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

或者,在代码中

.controller("ChildOfChild", function($scope){
   $scope.someParentFunctionInScope();
});
Run Code Online (Sandbox Code Playgroud)

好处:

  • 适用于从上到下的数据传播

缺点:

  • 从底部到顶部不太好,因为它需要一个对象(而不是一个原始对象)
  • 调用祖先函数会产生紧密耦合
  • 兄弟姐妹之间的不工作,除非一个共同的祖先一样$rootScope,使用


范围继承+ $watch

控制器仅响应范围暴露数据的变化,从不调用函数.

.controller("Parent", function($scope){
  $scope.VM = {a: "a", b: "b"};
  $scope.$watch("VM.a", function(newVal, oldVal){
    // react
  }); …
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-controller

9
推荐指数
2
解决办法
2395
查看次数

标签 统计

angularjs ×2

angularjs-controller ×1

scope ×1