2014-02-05 83 views
1

我想知道哪个是最佳实践,或者可能在哪种情况下优先于其他方式。控制器之间的通信Angularjs,服务或父控制器

的设置是,如果我们使用父(主)控制器如下:

<div ng-controller="Controller Main"> 
    <div ng-controller="Controller 1"></div> 
    <div ng-controller="Controller 2"></div> 
</div> 

因此,我们可以在这里,因为这两个控制器1和2的访问控制主要的范围进行通信。

另一种方式是,如果我们使用服务,

<div ng-controller="Controller 1"></div> 
<div ng-controller="Controller 2"></div> 

因此,我认为我们正在做的是,我们注入的服务控制器。

我见过这两种解决方案,但我不知道哪一个是首选。

回答

2

最好使用服务。通过使用父控制器进行通信会破坏封装,更不用提它了,如果你遇到不知道原语和范围继承等限制的人,那么它可能会非常麻烦.Atular的依赖注入非常好,而且你的代码在如果你这样做,长期运行。

服务的另一个优点是代码可读性。如果Controller 1引用Controller Main中的内容,则阅读代码的人可能不知道它来自何处。有了一个服务,你看到它注入,你立即知道在哪里寻找它。

+0

是的,我开始想父控制器很容易,但后来它更模块化,更容易阅读如果你分开不同的控制器并在它们之间使用“桥”,则可以使用代码。我也认为以这种方式扩展和维护代码更容易,也许更容易检测错误。我的第一个解决方案实际上是父母控制者,因为我对目前的范围理念只有非常满意,但随后我搜索了一下,看到了引入服务来完成这项工作的新方法。 –

0

您可以使用诸如:

'use strict'; 
       (function(window, angular, undefined) { 
        'use strict'; 
        angular.module('ctrl.parent', []) 
         .controller('ParentController',function (scope) { 
          scope.vocalization = ''; 
          scope.vocalize = function() { 
           console.log(scope.vocalization); 
          }; 
        }); 
       })(window, angular); 
       angular.module('app',['ctrl.parent']) 
        .controller('ChildCtrl', function($scope,$controller){ 
        angular.extend($scope, new $controller('ParentController', {scope:$scope})); 
$scope.vocalization = 'CIP CIP'; 
       }); 

看看angularjs-share-config-directives-between-controllers

它稍长

+0

我还不熟悉扩展概念,但我会研究它。 –

+0

这是用于共享配置,而不是在控制器之间进行必要的通信。 –