2017-04-08 79 views
0

我正在尝试更新多个组件的视图。出于这个原因,我正在使用广播。如果我使用我的代码而不使用$ apply(),则视图不会更新。如果我在多个视图中使用apply,我正在'[$ rootScope:inprog] $ apply already progress'错误。更新多个视图

更改代码

service.prototype.setNewTopic = function (topic) { 
    var self = this; 
    var promise = $http(
    { 
     method: 'POST', 
     url: self.baseUrl + 'Admin/setNewTopic', 
     contentType: 'application/json', 
     data: { 
      topicName: topic 
     } 
    }); 

    return promise; 
} 
+0

这并不是真的很清楚你在尝试什么o从这个片段中完成,但它*看起来像*您试图广播并让每个组件都获得数据以响应广播。这看起来效率不高,但数据绝对应该在不使用'$ scope。$ apply()'的情况下更新。这**感觉像** [XY问题](https://meta.stackexchange.com/a/66378/297619)。你应该询问为什么你的数据没有在第一时间更新,而不是为什么'$ scope。$ apply()'不起作用。换句话说,显示你的组件和它的视图[mcve]。 – Claies

+0

谢谢。如果这种接缝效率低下,可否请您指出我更有效的方式 – user6934713

+0

不是没有看到*你实际想要做什么*的例子,没有。 – Claies

回答

1

我改变你的方法$的行为,它应该recive从$广播的数据,我想在适当的组件设置。

//控制器 - 我假设在控制器中的$ scope属性被称为$ scope.newTopic

service.setNewTopic($scope.newTopic).then(function(data) { 
     $rootScope.$emit('testMonitor',$scope.newTopic) 
    }) 

//这些每一个聆听组件

$rootScope.$on('testMonitor', function(data) { 
    $scope.newTopic = data; 
}); 

我改变了服务只做http工作 //服务

service.prototype.setNewTopic = function (topic) { 

    return $http(
    { 
     method: 'POST', 
     url: self.baseUrl + 'Admin/setNewTopic', 
     contentType: 'application/json', 
     data: { 
      topicName: topic 
     } 
    }); 

} 
+0

非常感谢。这就是我需要的。即使在我正在设置主题的控制器中,也要以同样的方式使用它。或者我需要为此创建一个单独的HTTP。或者,也许我应该回复承诺,然后播出。 – user6934713

+0

我想控制器应该调用你的service.setNewTopic(topic)。我个人认为控制器应该处理广播,service.setNewTopic()。然后(函数(数据){$ rootScope。$ emit('testmonitor',data)})。这意味着该服务应该只进行http调用,只...我也将它从$ rootScope。$ broadcast('testMonitor')更改为$ rootScope。$ emit('testMonitor'),因为这是一个较便宜的调用make –

+0

谢谢。我认为我在广播的数据是json对象,但我有'成功'。我试图解析它像:self.newTopic = $ .parseJSON(data); 。我得到了错误,说明json不正确。我可以在视图中设置数据吗?如何在控制器中更改代码中设置数据? – user6934713