角度控制器调用函数两次

时间:2017-06-28 01:34:37

标签: angularjs firebase firebase-realtime-database

我正在创建一个待办事项列表应用程序,并希望拥有它,因此当任务在那里超过五秒时,任务会将console.logged作为已过期。但目前该任务已被记录两次。

模板:

    <h2>Active</h2>
       <div class = "container">
          <div class="tasks">
             <ul>
                <li ng-repeat= "task in home.tasks" class="task">{{task.task}}{{home.time(task)}}</li>
            </ul>
          </div>
       </div>

控制器:

    (function(){
       function HomeCtrl(Task, $timeout){
          // Tasks
          this.tasks = Task.all;

          //Adding tasks
          this.taskName = null;
          this.addTask = Task.addTask;

          //Expired
          this.time = Task.createdAt;

      }
      angular
          .module('Blocitoff')
          .controller('HomeCtrl', ['Task', '$timeout', HomeCtrl]);
    })();

服务:

(function(){
    angular
        .module('Blocitoff')
        .factory('Task', ['$firebaseArray', Task])

    function Task($firebaseArray){

        var ref = firebase.database().ref().child("tasks");
        var tasks = $firebaseArray(ref);



        return {
            all: tasks,

            addTask: function(){
                    tasks.$add({ task: this.taskName, timeCreated: (Date.now())}).then(function(ref) {
                      var id = ref.key;
                      console.log("added record with id " + id);
                      tasks.$indexFor(id); // returns location in the array
                    });
               alert(this.taskName + " has been added to active tasks");
            },

            createdAt: function(task){
                if(Date.now() - task.timeCreated > 5000){
                    console.log(task.task + " has expired");
                };
            }
        };

    }

})();

1 个答案:

答案 0 :(得分:0)

{{home.time(task)}}将观察者绑定到该函数,并在摘要周期中执行多次。

来自文档:

  

$watch(watchExpression, listener, [objectEquality]);

     

只要listener更改,就会注册watchExpression回调。

     
      
  • 每次调用$digest()时都会调用watchExpression,并应返回将要观看的值。 (watchExpression在使用相同输入执行多次时不应更改其值,因为它可能会被$digest()多次执行。也就是说,watchExpression应为idempotent。)
  •   
     

— AngularJS $rootScope/$scope API Reference - $watch