angularjs在摘要完成后保存更改

时间:2013-04-29 12:04:36

标签: angularjs angularjs-timeout

我认为这可能是任何角度应用程序的常见用例。我只是在观察我的作用域上的一些对象,这些对象在几个摘要周期中被更改。在消化它们(通过数据绑定更改它们的值)之后,我想将它们保存到数据库中。

一个。现在,在目前的解决方案中,我看到了以下问题:

  1. 在$ timeout()中运行save - 如何确保仅调用save 一旦

  2. 在$ scope中运行自定义函数。$ evalAsync - 如何找出已被删除的内容

  3. 这两个问题当然都有解决方案,但我所知道的并不是我的优雅。

    问题是:问题最优雅的解决方案是什么?

    B中。

    的最佳做法是什么?
    1. 确保在摘要周期中仅保存一次保存

    2. 在上次摘要后发现该对象

1 个答案:

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