如何更新同一控制器的所有实例

时间:2016-06-27 17:46:13

标签: angularjs controller static-members instances

我知道如何使用服务在控制器之间共享数据,但这种情况有所不同所以请重新考虑这个问题。

UI有这样的东西:

<jsp:include page="../home/Header.jsp" />
<div data-ng-view></div>
<jsp:include page="../home/Footer.jsp" />

在ng-view中,我使用&#34; data-ng-controller =&#34; BuildController作为ctrl&#34;来实例化一个控制器实例。它将运行此功能,可能需要长达2个小时。完成后,buildCompletionMsg会更新并弹出一个框,说明它已完成。

   self.buildServers = function(servers, version) {
        BuildService.buildList(servers, version).then(
            function(data) {
                self.buildCompletionMsg = data;
                $('#confirmationModal').modal('show');
            },
            function(errResponse) {
                console.error("Error getting servers." + errResponse);
            }
        );
    };

问题在于我希望模式位于Header.jsp文件中,因此无论用户在哪个视图中,他们都会看到通知。因此在Header.jsp中我有另一个控制器实例使用&#34; data-ng-controller =&#34; BuildController as ctrl&#34;并使用

绑定它
<div data-ng-controller="BuildController as ctrl">
   <div class="modal fade" id="confirmationModal" role="dialog" aria-labelledby="confirmLabel">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-body">
                <h3>{{ ctrl.buildCompletionMsg }}</h3>
            </div>          
        </div>
    </div>
  </div>
</div>

正如你所看到的,即使我做了类似的事情:

  self.buildCompletionMsg = BuildService.getCompletionMsg();

它只会更新ng-view页面的ctrl实例,而Header.jsp中的那个仍为null。

如何在不同页面中更新BuildController的所有实例,或者只更新Header.jsp文件中的实例?

1 个答案:

答案 0 :(得分:0)

我找到了自己问题的答案。解决方案是在服务中有一个对象引用或数组(它不适用于简单的字符串),如下所示:

angular.module('buildModule').factory('BuildService', ['$http', '$q', function($http, $q) {

  var self = {};
  self.completionStatus = { data: "" };

然后在$ http成功更新completionStatus

self.status.data = response.data;

在控制器中,变量直接设置为此对象

  self.buildCompletionMsg = BuildService.completionStatus; 

这会更新所有页面上的变量{{buildCompletionMsg}}。