2017-06-28 5 views
0

Ich erstelle eine To-Do-Liste App und möchte es so haben, wenn eine Aufgabe für mehr als fünf Sekunden dort ist, wird die Aufgabe console.logged als abgelaufen. Derzeit wird die Aufgabe jedoch zweimal protokolliert.Angular Controller Aufruf Funktion zweimal

Vorlage:

<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> 

Controller:

(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]); 
    })(); 

Service:

(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"); 
       }; 
      } 
     }; 

    } 

})(); 
+0

die Konsolenmeldung ist zweimal gedruckt? –

+0

Sie haben so viele Dinge namens "Aufgabe", die schwer zu sagen ist, worüber Sie sprechen. '{{home.time (task)}}' ist eine Funktion, die während eines Digest-Zyklus mehrfach aufgerufen wird. Ist das der eine? – georgeawg

+0

Ja '{{home.time (Aufgabe)}}' ist die Funktion, die mehrmals aufgerufen wird. Ich möchte nur, dass es einmal aufgerufen wird. Was wäre der richtige Weg, es zu nennen? – Tchbell

Antwort

0

{{home.time(task)}} einen Beobachter an die Funktion bindet und wird mehrmals während eines Digest Zyklus ausgeführt werden.

Aus dem Text & Tabellen:

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

Registriert einen listener Rückruf ausgeführt werden, wenn die watchExpression Änderungen.

  • Die watchExpression wird bei jedem Aufruf zu $digest() genannt und soll den Wert zurück, beobachtet wird. (Watchausdruck soll seinen Wert nicht ändern, wenn sie mehrmals mit dem gleichen Eingang ausgeführt, da es durch $digest() mehrfach ausgeführt werden kann. Das heißt, soll Watchausdruck idempotent sein.)

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

Verwandte Themen