2012-10-13 19 views
5

我定义在App.run某些型号低于我控制器someCtrl内覆盖:

App.run(['$rootScope', function($rootScope) { 
    $rootScope.attempt = 1; 
}); 

function someCtrl($scope, $rootScope) { 
    $rootScope.attempt = 2; 

    $rootScope.checkAttempt = function() { 
    return $rootScope.attempt > 1 ? true : false;  
    }; 
} 

还有就是对网页上的按钮出来的someCtrl's范围:

<button class='btn' ng-disabled="checkAttempt()">Who's changing my value?</button> 

仅供参考,我'知道创建一个服务或使用发射广播机制来跨控制器共享数据,但我想知道如何验证是否将$ rootScope注入控制器?

回答

10

恕我直言,我认为它很好,将$rootScope注入控制器。我会建议使用发射/广播。

+0

有关使用rootScope的一件事是您可以向下广播到所有子范围。还有一点需要注意的是,在使用范围时,最佳做法是不直接附加到范围上,即在范围上创建对象,所以$ rootScope.my = {attempt:1}。这是双向数据绑定的关键,你不太容易失去绑定。 –

7

您不需要将$ rootScope注入控制器。当您注入$ scope时,由于范围继承,您可以自动访问$ rootScope中定义的任何内容。见documentation。向下滚动到范围层次结构部分。

1

那么,将$rootScope注入到控制器,服务或指令中并没有什么坏处,但是您试图弄清楚它是否真的有必要。原因是绑定到$rootScope的任何方法或属性都会使其成为全局的,除非手动清理并且创建全局变量创建的所有这些问题,否则不会被GC化。

跨多个控制器共享数据的最佳方式是使用服务。

相关问题