AngularJS后台任务指令更新控制器

时间:2015-11-03 21:36:42

标签: javascript angularjs angularjs-directive intervals background-task

在我的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}} 再次运行才能在重新控制控制器时获得更新。

那我怎么解决这个问题呢? 我的有更好的解决方案吗?

1 个答案:

答案 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");
    });