2014-11-08 91 views
1

我有一个变量数组(我将其称为ArrVar),它可通过服务提供给所有控制器。该变量已被指定为范围变量CtrlA as $ scope.ArrVar。如果用户在CtrlA下切换按钮,则附加到CtrlA的方法将更改为$ scope.ArrVar,更新服务中的变量并使用ng-repeat显示列表。控制器间共享范​​围变量的最佳做法是什么?

但我有一个完全独立的控制器,CTRLB,这需要做下CTRLA,这是不可访问从CTRLB变化范围变量。

我能想到的两种解决方案:

  1. 全局控制器
  2. 在根范围

分配变量,但两种方法似乎并没有成为最佳实践。有没有其他优雅的方式呢?两个控制器完全不同,所以合并不会。

+0

我想大多数人通常与SharedServices去。在这个网站上有几个关于他们的问题。 – dckuehn 2014-11-08 05:38:14

+0

但服务不允许更新范围变量。 CtrlB可以通过使用该服务来接收最新更新的ArrVar,但它无法访问$ scope.ArrVar,它在CtrlA – Jas 2014-11-08 05:42:47

+0

的范围内您可以更新属于共享服务的变量,并观察该变量从一个控制器。当该值改变时,CtrlB可以执行一个动作,更新由CtrlA监视的另一个sharedService变量,然后触发另一个动作。 – dckuehn 2014-11-08 05:44:32

回答

1

如果您共享特定于obj (如元素位置data.msg)的数据,它将与服务绑定而不观看任何内容或任何内容。

2 controllers plunker

app.controller('FirstCtrl', function($scope, Shared) { 
    $scope.data = Shared; 
}) 
.controller('SecondCtrl', function($scope, Shared) { 
    $scope.data = Shared; 
}) 
.factory('Shared', function() { 
    return { msg : ['one','two','three'] } 
}); 

    <div ng-controller="FirstCtrl"> 
     <input ng-model="data.msg"/> 
     {{data}} 
    </div>  
    <div ng-controller="SecondCtrl"> 
     <input ng-model="data.msg"/> 
    {{data}} 
    </div> 
+0

谢谢Dylan,但我已经尝试了这种方法,但是阵列没有立即更新。实际上,每个函数调用之间都有一个延迟,所以前面的函数调用结果被传递给作用域...(这可能是因为在新函数完成之前,作用域变量被更新)我试过了运行$ scope。$手动应用,但我得到一个错误,说它已经在进行中。我不得不使用$超时为了防止它的工作。有没有其他方式,然后超时? – Jas 2014-11-09 22:30:06

+0

如果您正在等待某个事件完成,那么该控制器可能需要$ watch,但这不应该破坏2的初始绑定。如果没有示例,可能会出现一个重击者,这很难说。 – Dylan 2014-11-09 22:43:54

+0

我终于明白了。简而言之,服务中的ArrVar在API调用中进行了更新,因此我必须使用$ apply来进行即时更新。非常感谢! – Jas 2014-11-10 08:45:59

相关问题