2013-04-29 3 views
2

Я думаю, что это может быть довольно распространенный случай использования с любым угловым приложением. Я просто наблюдаю за некоторыми объектами моего масштаба, которые меняются как часть нескольких циклов дайджеста. После переваривания их (изменение их значений посредством привязки данных) закончен, я хочу сохранить их в базу данных.angularjs сохраняет изменения после завершения дайджест

A. Теперь, с текущими решениями я вижу следующие проблемы:

  1. управлением сохранить в $ тайм-аут() - как гарантировать, что сохранить вызывается только один раз

  2. работает обычай функция в $ объеме $ evalAsync. - как узнать, что было chaged

Есть, конечно, решения для обоих этих prolblems, но не из тех, кого я знаю, кажутся мне элегантными.

Вопрос такой: Что является самым элегантным решением проблемы?

B. В частности, каковы лучшие практики в

  1. убедитесь, что сохранить вызывается только один раз в цикле дайджеста

  2. выяснить, что объект является грязный после последнего дайджест

+0

почему вы хотите, чтобы проверить объект загрязнен, потому что угловая проверю его antomatically –

+0

Эти изменения происходят потому, что пользователь взаимодействует с пользовательским интерфейсом? или есть еще одна причина? –

ответ

2

Вот решение, которое я нашел лучшим для меня - как модуль AMD. Вдохновленный Подчеркиванием.

/** 
    * 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 = true, это, как представляется, вызывает дайджест при каждом вызове debounce, а не только в последний раз, когда вызывается debounced fn. переходя в false исправляет это, но тогда вам нужно вручную вызвать apply() в debounced fn – chrismarx