AngularJS:不同视图中控制器之间的通信

时间:2015-06-03 19:47:21

标签: javascript angularjs controller communication

我有不同的视图,每个视图由不同的控制器创建。在特定时间,只有一个视图可见。

我想通过第一个视图的控制器的功能从一个视图切换到另一个视图,之后我想调用第二个视图控制器的方法。

我的问题是如何以有棱角的方式调用此方法?

我知道使用$ broadcast和$ on的可能性,但闻起来有点气味。

另一种选择是在dom中找到范围并通过范围调用方法。但那更难看。

什么是最佳解决方案?

3 个答案:

答案 0 :(得分:0)

您可以使用服务在控制器之间进行通信。虽然您可以创建一个通用的共享服务来拥有订阅和广播事件的中心点,但随着时间的推移,服务更容易维护。

答案 1 :(得分:0)

您可以使用Angular Routing

查看文档。这是文档的摘录。你可以建立像

这样的链接
<a href="#/phones">Link</a>

对于第一条路线,依此类推。

phonecatApp.config(['$routeProvider',
  function($routeProvider) {
    $routeProvider.
      when('/phones', {
        templateUrl: 'partials/phone-list.html',
        controller: 'PhoneListCtrl'
      }).
      when('/phones/:phoneId', {
        templateUrl: 'partials/phone-detail.html',
        controller: 'PhoneDetailCtrl'
      }).
      otherwise({
        redirectTo: '/phones'
      });
  }]);

答案 2 :(得分:0)

好的,按预期完成并且更简单。

我们的想法是使用两个视图(控制器)中使用的服务,其中包含一个执行布尔值&#39;。

第一个视图将布尔值设置为true,第二个视图在此布尔值上设置监视,因此被调用并可以调用所需的方法。

在服务中:

trigger: function(name) { model[name] = true; },
setTriggerWatch: function(scope, name, callback) {
    scope.$watch(function value() {
        return model[name];
    }, function listener(newValue, oldValue) {
        if (newValue) {
            callback();
        }
    });
},

在目标控制器中:

sessionData.setTriggerWatch($scope, 'createSession', function callCreateSession() {
    _createSession();
});

在源代码管理器中:

sessionData.trigger('createSession');