2014-04-30 4 views
8

Ich mache eine Webseite, die Sie den Text bearbeiten können und nachdem Sie für 1 Sekunde aufhören zu tippen wird automatisch gespeichert, was Sie eingegeben haben.

Momentan arbeite ich nur die $ Timeout Details aus. Ich habe es funktioniert, wenn ich die update Methode ohne params nennen, aber wenn ich es mit params nennen, erhalte ich die Fehlermeldung:

Error: fn is not a function $TimeoutProvider/this.$get</timeout/timeoutId<@http://localhost:63342/express_example/bower_components/angular/angular.js:14014 [email protected]://localhost:63342/express_example/bower_components/angular/angular.js:4300 Browser/self.defer/timeoutId<@http://localhost:63342/express_example/bower_components/angular/angular.js:4601 

Warum bin ich diesen Fehler, wenn dabei:

timeout = $timeout(update(element, content), 1000); 

aber nicht, wenn ich tun:

timeout = $timeout(update, 1000); 

Offensichtlich muss ich die params in die Update-Methode übergeben, weil ich muss wissen, was zu aktualisieren.

debounceUpdate($(this), data.content); 

var debounceUpdate = function(element, content) { 
    console.log('in debouce'); 
    if (timeout) { 
     $timeout.cancel(timeout); 
    } 

    timeout = $timeout(update(element, content), 1000); 
}; 

// Update an existing section 
var update = function(element, content) { 
    console.log('in update'); 
    console.log('section_id to update is '+element.data('sectionId')); 
    console.log(content); 
} 
+0

* die params in die Update-Methode übergeben * - http://stackoverflow.com/questions/1190642/how-can-i-pass-a- Parameter-to-a-settimeout-callback –

Antwort

13

Ihr Code ruft update sofort und versucht, ihren Rückgabewert als $timeout Rückruf zu übergeben. Sie wollten wirklich Updates von den $timeout Handler rufen statt:

timeout = $timeout(function() {update(element, content);}, 1000); 
+0

Interessant .. Können Sie das näher ausführen? Ich verstehe Rückrufe in js, aber ich denke, ich bin mir nicht sicher, wie Ihre Antwort (die funktioniert) unterscheidet sich von dem, was ich hatte. – Catfish

+4

'update (Element, Inhalt)' ruft 'update' auf. Jetzt sofort. Also '' $ timeout (update (element, content), 1000) 'ruft' update' sofort auf und übergibt dann den Rückgabewert als ersten Parameter an '$ timeout', was auch gleich aufgerufen wird. –

+2

'function() {update (element, content);}' erstellt eine Closure, die, wenn sie aufgerufen wird, 'update' aufruft. '$ timeout (function() {update (Element, Inhalt);}, 1000)' ruft '$ timeout' sofort auf und übergibt diese Schließung als erstes Argument. '$ timeout' wartet eine Weile und ruft dann die Schließung auf, die 'update' aufruft. –

Verwandte Themen