2016-03-28 13 views
1

Ich bin Anfänger mit angularJs und habe, wie ich denke, ein einfaches Problem mit whatching Änderungen in meinem $scope.Wie aktiviert man automatische watch angularJs?

Ich habe ein Objekt $scope.tasks, die ich vom Server erhalten habe. Es sieht aus wie:

{ 
2: {id: 2, name: 'name1', user: 3}, 
3: {id: 3, name: 'name2', user: 1}, 
4: {id: 4, name: 'name3', user: 4}, 
} 

auch i eine Funktion, die Update-Benutzer in Aufgabe haben:

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).success(function(data, status) { 
     $scope.tasks[taskId].user = userId; //#1 
    }); 
}; 

ich habe auch benutzerdefinierte Funktion $scope.test(); diese Funktion nach jedem Benutzerwechsel in Aufgaben ausgeführt werden müssen, zum Beispiel nach dem Update-Abfrage und Aktualisierung bei // # 1

ich habe versucht, für dieses Ziel $ Uhr zu verwenden und $ watchCollection:

$scope.$watchCollection('tasks', function() { 
    $scope.test(); 
}) 

Aber das hilft nicht. Und jetzt muss ich an allen Stellen $scope.test() einfügen, wenn ich meine $ scope.tasks aktualisiere. Es ist sehr traurig. Wie kann ich es automatisch machen?

+1

Wann registrieren Sie die Uhr und wie lösen Sie Änderungen aus? –

+0

@DavidL Ich registriere Uhr am Ende meines Controllers und triggere die Änderung mit ng-change in select. – Neversmile

+0

Das ist dein Problem. Registrieren Sie es am Anfang. Wenn Sie es am Ende registrieren, gibt es eine vernünftige Chance, dass es erst registriert wird, wenn die Interaktion, die es beobachten würde, bereits vorüber ist. Und schließlich könnte dies ein Anzeichen für einen Design-Geruch sein. Möglicherweise möchten Sie stattdessen eine Callback-ähnliche Vorgehensweise in Betracht ziehen. –

Antwort

1

Verwenden der Uhr ist nicht gut, um es im Code zu haben. Ich würde sagen, dass ein Anruf an test Methode, wenn Sie update Aufruf wird erfolgreich.

Und in einem success Rückruf von post Telefonieren eines anderer Anruf zu tasks Liste aktualisiert wird Ihre view Daten richtig synchron mit Server-Daten zu machen. Derzeit aktualisieren Sie Daten auf der Clientseite selbst für bestimmte Datensätze, was bei datenzentrierter Anwendung, die von mehreren Benutzern häufig verwendet wird, keinen Sinn ergibt. Angenommen, Sie haben 1000 Benutzer, die auf diese Anwendung zugreifen, und während Sie einen Datensatz aktualisieren, haben andere Benutzer auch updated/added alle Datensätze auf derselben Seite. Das fügt inkonsistente Verhaltensweisen innerhalb der Anwendung hinzu. Deshalb schlage ich vor, dass Sie noch einmal einen Ajax machen, um die Daten zu holen &, um Ihre Anwendung konsistenter und genauer zu halten. Einen weiteren Ajax-Anruf zu tätigen, würde nicht dauern, was aus guten Gründen weniger kostenpflichtig ist.

-Code

$scope.managePlannedIterationTask = function(taskId, userId) { 
    var data = { 
     'taskId' : taskId, 
     'userId' : userId 
    }; 
    $http.post("url", data).then(function(response) { 
     var data = response.data; 
     $scope.getTasks(); 
     $scope.test(); 
    }); 
}; 

$scope.getTasks = function(){ 
    $http.get('getTasksUrl').then(function(response){ 
     $scope.tasks = response.data; 
    }); 
} 
+0

Ich weiß, dass die Verwendung von $ watch zu Leistungsproblemen und einer Art schlechter Übung führen kann ... aber warum sagst du, es ist eine "schlechte Praxis"? Ich denke nicht, dass es immer eine schlechte Praxis ist. –

+0

@PankajParkar Ja, ich stimme dir zu. Ich zeige meinen Code schematisch und sehr einfach. Ich aktualisiere meine Aufgaben mit '$ scope.tasks [taskId] .user = userId;' wenn die Abfrage erfolgreich ist. In meinem Beispiel mag ich nicht alle Aufgaben wieder, wenn ich nur einen Benutzer in der Aufgabe ändere. Ich denke, das ist nicht gerechtfertigt – Neversmile

+0

@ Gonzalo.- weil Sie wissen, dass Beobachter gut sein wird, dass Ausdruck in jedem Digest-Zyklus zu beobachten. Angenommen, Sie haben große Sammlung Objekt, das 'tiefe' Beobachter hat, so dass wird durcheinander bringen und verlangsamen Ihre Anwendung Leistung .. daher versuchen, die Verwendung von Watcher beim Entwerfen der Anwendung zu vermeiden .. persönlich empfehle ich auf diese Weise .. –

0

Sie eine Richtlinie mit Beobachter schreiben kann und setzen auf Modelle, die Sie beobachtet werden soll. Aber wenn ich Sie richtig verstanden habe, müssen Sie die Daten auf Ihrer Seite nach erfolgreicher Postanforderung aktualisieren. Sie können dies erreichen, indem Sie get request, nach erfolgreicher Post oder im schlimmsten Fall je nach verwendetem Router route oder state reload verwenden .

Verwandte Themen