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

我目前正在使用一个可怕的软糖涉及窗口:

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);
    }
}

当前回答

由于defineProperty存在浏览器兼容性问题,我认为我们可以考虑使用服务。

angular.module('myservice', [], function($provide) {
    $provide.factory('msgBus', ['$rootScope', function($rootScope) {
        var msgBus = {};
        msgBus.emitMsg = function(msg) {
        $rootScope.$emit(msg);
        };
        msgBus.onMsg = function(msg, scope, func) {
            var unbind = $rootScope.$on(msg, func);
            scope.$on('$destroy', unbind);
        };
        return msgBus;
    }]);
});

并像这样在控制器中使用它:

控制器1 函数($scope, msgBus) { 美元的范围。Sendmsg = function() { msgBus.emitMsg(“somemsg”) } } 控制器2 函数($scope, msgBus) { msgBus。onMsg('somemsg', $scope, function() { //你的逻辑 }); }

其他回答

function mySrvc() {
  var callback = function() {

  }
  return {
    onSaveClick: function(fn) {
      callback = fn;
    },
    fireSaveClick: function(data) {
      callback(data);
    }
  }
}

function controllerA($scope, mySrvc) {
  mySrvc.onSaveClick(function(data) {
    console.log(data)
  })
}

function controllerB($scope, mySrvc) {
  mySrvc.fireSaveClick(data);
}

你应该使用服务,因为$rootscope是整个应用程序的访问,它会增加负载,或者如果你的数据不多,你可以使用rootparams。

使用rootScope美元。$broadcast和$scope。$on PubSub通信。

另外,请参阅这篇文章:AngularJS -控制器之间的通信

由于defineProperty存在浏览器兼容性问题,我认为我们可以考虑使用服务。

angular.module('myservice', [], function($provide) {
    $provide.factory('msgBus', ['$rootScope', function($rootScope) {
        var msgBus = {};
        msgBus.emitMsg = function(msg) {
        $rootScope.$emit(msg);
        };
        msgBus.onMsg = function(msg, scope, func) {
            var unbind = $rootScope.$on(msg, func);
            scope.$on('$destroy', unbind);
        };
        return msgBus;
    }]);
});

并像这样在控制器中使用它:

控制器1 函数($scope, msgBus) { 美元的范围。Sendmsg = function() { msgBus.emitMsg(“somemsg”) } } 控制器2 函数($scope, msgBus) { msgBus。onMsg('somemsg', $scope, function() { //你的逻辑 }); }

GridLinked发布了一个PubSub解决方案,看起来设计得很好。该服务可以在这里找到。

还有他们的服务图表: