2012-10-22 167 views
2

我已閱讀了關於$ cacheFactory的內容,當涉及到$ http時,它會通過url緩存所有內容。 現在,我有一些更復雜的需求:AngularJS高級緩存技術

  1. 有某種(用戶,文章等)的項目清單。這個 列表從服務器拉出並緩存到緩存中。

  2. 當應用程序請求單個項目不言而喻緩存和:

    2.1。如果存在提供密鑰的項目,則它從緩存中拉出

    2.2。如果項目不存在於緩存列表中,則它會轉到服務器,並且當從服務器獲取響應時將此項目放入緩存列表,以便下次將其從緩存中拉出時

  3. 將項目保存到數據庫時,會獲取一些密鑰(自動編號或guid)以及服務器解析響應時:

    3.1。如果項目已經存在於高速緩存中,則項目與服務器數據合併/擴展

    3.2。如果項目不在緩存中,它只是簡單地添加到列表中

  4. 應用程序應檢查(每10秒)列表中是否有一些新的/更新/刪除的項目(由其他用戶創建)並刷新它(對當前用戶工作沒有顯着影響)

現在,1-3很容易,4應該手動啓動或放入某個定時器。

額外的複雜性是如何處理搜索時,您有無限數量的查詢組合。

我有如何開發所有這些的想法,但我想知道是否已經證明了AngularJs的解決方案,或者通常用於javascript和ajax調用。

回答

9

可能需要創建自己的服務來做到這一點。

類似的信息(僞代碼,因爲我沒有一臺服務器來支持任何的這件事)...

app.factory('andrejsSuperAwesomeService', ['$cacheFactory', '$http', function($cacheFactory, $http) { 

    //get your cache ready. 
    var userCache = $cacheFactory('users'); 

    // start an interval to check for data. 
    // TODO: add a public function to turn this on and off. 
    setInterval(function(){ 
     //check for changes to the data. 
     $http.get('/Get/New/User/Changes') 
      .success(function(changes) { 
       if(!changes) return; 
       //we'll assume we get some collection of changes back, 
       // with some change type and the user data. 
       for(var i = 0; i < changes.length; i++) { 
         var change = changes[i]; 
         switch(change.changeType) { 
          case 'delete': 
          // okay just remove the deleted ones. 
          userCache.remove(change.user.id); 
          break; 
          case 'addUpdate': 
          // if it's added or updated, let's just 
          // remove and re-add it, because we can't know what 
          // we already have or don't have. 
          userCache.remove(change.user.id); 
          userCache.put(chnage.user.id, change.user); 
          break; 
         } 
       } 
      }); 
    }, 10000); // every 10 secs 
    return { 
     users: { 
      //a function to get a user. 
      get: function(userId, callback) { 
       var user = userCache.get(userId); 

       if(!user) { 
        //the user is not in the cache so let's get it. 
        $http.get('/Uri/To/Get/A/User?userId=' + userId) 
         .success(function(data) { 
          //great, put it in the cache and callback. 
          userCache.put(userId, data); 
          if(callback) callback(data); 
         }); 
       } else { 
        //we already have the user, callback. 
        if(callback) callback(data); 
       } 
      } 
     } 
    }; 
}); 

然後在您的控制器你注入你的服務,並使用它像這樣:

andrejsSuperAwesomeService.users.get(12345, function(user) { 
     //do something with user here. 
     alert(user.name + ' is a naughty user!'); 
}); 
+0

你可以讓該服務使用angulars $區間指令,讓您在使用$範圍,而不是希望它得到回升 – DrogoNevets