跨所有控制器的服务单例

时间:2015-07-14 15:15:16

标签: angularjs

如果我有以下内容:

<div ng-controller="mainCtrl">
    {{vm.name_from_service}}
</div>
....
<div ng-controller="mainCtrl">
    {{vm.name_from_service}}
</div>

让我们说它们都从工厂/服务中提取name_from_service值,假设在两个mainCtrl控制器实例中使用相同的服务单例是否正确?

请注意,mainCtrl使用了两次。

控制器代码段:

$scope.vm.name_from_service = someservice.getName();

Snippet#2:

下面的ng-view和immediate div都使用相同的服务来检索name_from_service,但是name_from_service只在一个地方更新。

 <div ng-controller="mainCtrl">
         section 1
        {{vm.name_from_service}}
 </div>

 <div id="ngviewcontainer" ng-view=""></div>

此外,我没有使用任何异步ajax调用来检索name_from_service,因此angular应该知道这些更改。

我尝试过使用$ timeout和$ apply()。没有骰子 。

我重构并将不相关的逻辑分离到一个单独的控制器中并修复了问题。仍然有点困惑,为什么这两个值中只有一个在晚上更新,尽管两者都应该从相同的服务中提取。

3 个答案:

答案 0 :(得分:2)

是的,它会是相同的,除非一些摘要周期同步问题。 在某些情况下,您可以设置如下变量:

$scope.vm.name_from_service = someservice.getName();

但是如果你使用promises和 $ http 来电,那么有时候你必须使用$ watch手动观察单身人士的变化。这是两个控制器可以具有不同值的情况。

答案 1 :(得分:1)

是的,that is why it is called singleton

  

单例模式是一种限制实例化的设计模式   一个类到一个对象

还要看几乎相同的question

答案 2 :(得分:1)

您正在使用一个控制器 - mainCtrl。您的控制器可以使用多种服务。但是,您不能在控制器中使用相同名称的不同服务。所以,是的,您正在使用相同的服务。