2013-04-29 62 views
2

我認爲這可能是與任何角度應用程序相當常見的用例。我只是在觀察範圍內的一些對象,這些對象是作爲幾個摘要循環的一部分而改變的。消化它們(通過數據綁定更改它們的值)後,我想將它們保存到數據庫中。angularjs在摘要完成後保存更改

A.現在,當前的解決方案我看到以下問題:

  1. 在$超時運行保存() - 如何確保保存只調用 一次

  2. 運行自定義功能$ $範圍evalAsync - 如何找出已經chaged

當然也有解決方案,這兩個prolblems的,但非我認識的人似乎對我很優雅。

問題是:什麼是最優雅的解決方案?

B.特別是,什麼是

最佳實踐
  1. 確保保存在消化週期被調用一次

  2. 去年後發現,對象 Digest

+0

爲什麼你想檢查對象是髒的,因爲角會自動檢查它 – 2013-04-29 12:13:37

+0

這些更改是因爲用戶與UI交互?還是有另一個原因? – 2013-04-29 12:20:40

回答

2

這是我找到的最適合我的解決方案 - 作爲AMD模塊。受到Underscore的啓發。

/** 
    * Service function that helps to avoid multiple calls 
    * of a function (typically save()) during angular digest process. 
    * $apply will be called after original function returns; 
    */ 
     define(['app'], function (app) { 
      app.factory('debounce', ['$timeout', function ($timeout) { 
       return function(fn){ // debounce fn 
        var nthCall = 0; 
        return function(){ // intercepting fn 
         var that = this; 
         var argz = arguments; 
         nthCall++; 
         var later = (function(version){ 
          return function(){ 
           if (version === nthCall){ 
            return fn.apply(that, argz); 
           } 
          }; 
         })(nthCall); 
         return $timeout(later,0, true); 
        }; 
       }; 
      }]); 
     }); 


    /*************************/ 

    //Use it like this: 

    $scope.$watch('order', function(newOrder){ 
     $scope.orderRules.apply(newOrder); // changing properties on order 
    }, true); 

    $scope.$watch('order.valid', function(newOrder){ 
     $scope.save(newOrder); //will be called multiple times while digested by angular 
    }); 

    $scope.save = debounce(function(order){ 
     // POST your order here ...$http.... 
     // debounce() will make sure save() will be called only once 
    }); 
+0

該函數的最終版本允許傳遞超時值以及是否在超時中調用apply。奇怪的是,如果你使用apply = true,這似乎在每次調用去抖動時調用摘要,而不是調用去抖動fn的最後一次。通過錯誤修復這個,但是你需要手動調用去抖動的fn中的apply() – chrismarx 2013-10-15 20:48:49