在我的AngularJS应用程序中,我必须永久检查服务器端是否有新条目,然后更新客户端应用程序中保存的当前数据。
例如,我有一个控制器orders
,它包含一个包含Order
个对象的数组Order
。
当在另一个客户端的服务器端上通过REST API创建新directive
时,我想在我的应用程序中获取更新。
所以我写了一个orderRefresher
<body>
,它应用于$interval
并运行Orders
,每120秒获取所有订单。
获取新$rootScope
时,会从MyController
广播。
在$scope
中存在一个侦听器,在广播匹配事件时更新订单。
问题是,因为侦听器设置在orders
并且在控制器被销毁时没有被销毁,当我尝试设置try-catch
属性(不存在)时会导致错误。
我想过将它包装在$interval
内,但是我必须等到 {{#autoForm schema="asdf" id="sdfg" type="method" meteormethod="meth"}}
<fieldset>
{{> afQuickField name="startLocation"}}
{{> afQuickField name="destination"}}
{{> afQuickField name="date"}}
{{> afQuickField name="departureTime"}}
{{> afQuickField name="returnTime"}}
{{> afQuickField name="seats" type="number"}}
</fieldset>
<button type="submit" class="btn btn-primary">submit<button>
{{/autoForm}}
再次运行才能在重新控制控制器时获得更新。
那我怎么解决这个问题呢? 我的有更好的解决方案吗?
答案 0 :(得分:0)
最好的解决方案是将HTTP逻辑放在服务中(在应用程序的整个生命周期中存在的单例)
您可以让控制器在$interval
上发出请求,也可以让服务执行此操作。然后,控制器可以$watch
生成的订单,以节省您必须广播事件。
像这样的东西
app.service(
"orderService",
function( $http, $interval ) {
// Return public API.
var api = {
orders: []
};
$interval(update, 10000); //10 second interval
return api;
function update(){
$http("/api/request").then(function(response){
api.orders = response.data;
});
}
});
在您的控制器中,只需注入orderService
,然后执行类似
$scope.$watchCollection(
function(){
return orderService.orders
},
function(){
console.log("orders have changed");
});