2016-07-12 8 views
1

Manchmal müssen wir notifySubscribers verwenden, um die Ausführung von subscirbers eines Observablen zu erzwingen, Sie können einen Parameter an notifySubscribers übergeben, aber das Problem ist, dass der übergebene Parameter weder den Wert des beobachtbaren ändert noch an den subsriber weitergegeben wird Warum wird es benutzt? Ich sah in einigen Knockout doc, ein Parameter ist beispielsweise in this one übergeben. Hier ist eine jsfiddle code snippet, die die Tatsache bestätigt, dass der Parameter nirgends verwendet wird. Fehle ich etwas oder ist der Param tatsächlich bedeutungslos?Knockout, warum brauchen wir den Parameter für notifySubscribers?

-Code in jsfiddle html

<div data-bind="text: $data.content"></div> 

Javascript

var viewModel = { 
    content: ko.observable('original') 
}; 

var cpted = ko.computed(function(){ 
    alert(viewModel.content()); 
    return viewModel.content(); 
}); 

ko.applyBindings(viewModel); 

viewModel.content.notifySubscribers('new value'); 

alert(viewModel.content()); 
+0

Ich bin sehr neugierig, warum Sie "die Ausführung von Abonnenten erzwingen wollen", wenn sich der Wert nicht geändert hat. Was machen sie, wenn sich der Wert nicht geändert hat? – Tyrsius

+0

Es gibt ein Beispiel in diesem Dokument http://knockoutjs.com/documentation/extenders.html, suchen Sie einfach nach notifySubscribers @ Tyrsius –

Antwort

4

notifySubscribers ruft alle Abonnements, die für das gegebene Ereignis registriert haben. Standardmäßig werden Subskriptionen für das Ereignis change erstellt, das Subskriptionssystem unterstützt jedoch mehrere Ereignisse. Intern wirft Knockout auch ein Ereignis für beforeChange, das Sie im Quellcode here sehen können.

Die Unterschrift der subscribe Methode (gesehen here) ist

subscribe: function (callback, callbackTarget, event)

Wenn Sie die letzten Parameter weglassen, change standardmäßig verwendet wird. Aber Sie können die beforeChange Veranstaltung oder sogar Ihre eigenen Veranstaltungen zu abonnieren! Deshalb nimmt notifySubscribers einen Ereignisnamen an.

Sie haben gesagt, dass Sie versuchen, die Ausführung von Abonnenten zu erzwingen, wenn sich der Wert nicht geändert hat. Vielleicht ist ein benutzerdefiniertes Ereignis besser als das Ereignis change, da Sie es selbst dann ausführen, wenn sich der Wert nicht geändert hat.

+0

Ich bekomme Ihre Antwort nicht, scheint es irrelevant für mich. @Tyrsius –

+0

@David Ich habe einige Details hinzugefügt, hilft das? Wenn nicht, bitte erklären Sie Ihre Verwirrung – Tyrsius

+0

Ich denke, ich habe die Idee, mein Code-Snippet enthält nur die berechnete, so dass der übergebene valueToNotify nirgendwo verwendet wird, aber wenn ich viewModel.contentsubscribe (aCallback) aufrufen, ist der ValueToNotify der erste Param für den aCallback. Ich glaube, ich war im Wesentlichen verwirrt über den Unterschied zwischen Abhängigkeit und Abonnement, aber das ist eine andere Frage. @Tyrsius –