2016-07-04 84 views
1

目標:從外部源動態生成的列表。以角度動態添加到列表中

我已經設置了一個簡單的角度應用程序,從外部JSON源獲取事件列表。我希望在外部源添加事件時更新列表。它目前正在工作,但我有一個問題和三個問題:

1)我目前正在每15秒重寫列表。如何在不重寫列表的情況下添加到列表的末尾? (問題和疑問)

2)是否有另外一個更好的方式來跟上外部列表?我正在嘗試遵循「RESTful」技術,這是否意味着我應該依靠客戶端代碼來輪詢我每秒鐘的操作方式? (最佳實踐問題)

3)是否在控制器最佳實踐中設置超時?因爲它的控制頁面上的行動?(最佳實踐/理解問題)

var eventModule = angular.module('eventModule', []); 

eventModule.controller('eventControlller', 
    function($scope, $timeout, eventList) { 
    $scope.events = eventList.getAllEvents().success(
     function(events) {$scope.events = events}); 
    var poll = function() { 
     $timeout(function() { 
     $scope.events = eventList.getAllEvents().success(
     function(events) {$scope.events = events}); 
     poll(); 
     }, 15000); 
    };  
    poll(); 
}); 

eventModule.factory('eventList', function($http) { 
    var url = "http://localhost/d8/events/request"; 
    return { 
     getAllEvents: function() { 
    return $http.get(url); 
    } 
    }; 
}); 

回答

0
  1. 如果該列表是一個數組,並希望新成員添加到它,有幾種不同的方式。一種方法是使用prototype.concat()函數,就像這樣:

    function(events) { 
        $scope.events = $scope.events.concat(events) 
    }); 
    

    如果無法使用,那麼你可以去循環的解決方案:

    function concatenateEvents(events) { 
        events.forEach(function(element) { 
         events.push(element); 
        } 
    } 
    
  2. 關於更新的最佳途徑清單,這取決於你的要求。如果15秒對你來說不是太長,那麼你可以保留這個邏輯,但是如果你需要加快響應時間,甚至使其成爲實時,那麼你需要模擬服務器推送體系結構,它不同於默認Web架構,即請求 - 響應架構。基本上你可能想探索網絡套接字,和/或長時間輪詢,或者反向Ajax或彗星......有很多名字。 Web套接字是推薦的解決方案,其他人只有在您必須使用一些不兼容的瀏覽器的情況下。

  3. 關於第三個問題,我真的不知道。真的,從控制器內部控制UI並不好,但由於我真的不知道你的應用程序應該做什麼,我不知道這是否是一種不好的方法。

希望這有助於!

EDIT - 忘了補充另一個要點:您不需要將eventList.getAllEvents()分配給$ scope.events,就像您在回調處理函數中那樣。

也許你可以修改你的控制器是這樣的:

eventModule.controller('eventControlller', function($scope, $timeout, eventList) { 
eventList.getAllEvents().success(
    function(events) { 
     $scope.events = events 
    }); 
var poll = function() { 
    $timeout(function() { 
    eventList.getAllEvents().success(
    function(events) {$scope.events = events}); 
    poll(); 
    }, 15000); 
};  
poll(); 
});