2

Ich habe ViewModels, die mit dem Revealing Module Pattern implementiert werden. Ich verwende globale Knockout-Abonnenten, um eine entkoppelte Weitergabe von Daten zwischen diesen zu erreichen. Was ich tue, ist jetzt, eine Instanz eines Ansichtsmodell in einer Master-Ansichtsmodell zu erstellen:Initialisiere Abonnements für ko-scribable bei der Modulerstellung

NameSpace.MasterViewModel = function(){ 
    var viewModel = new viewModel(), 
     initSubscription = function(){ 
      viewModel.initSubscription(); 
     }; 

    return { 
     initSubscription: initSubscription 
    } 
} 

und initialisiert ein Abonnement in Ansichtsmodell wie folgt aus:

NameSpace.ViewModel = function(){ 
    var data, 
     initSubscription = function(){ 
      ko.postbox.subscribe("New Data"function(newData){ 
       this.data = newData; 
      }, this); 
     }; 

    return { 
     data: data, 
     initSubscription: initSubscription 
    } 
} 

Dies funktioniert, aber ich möchte wissen, Gibt es eine Möglichkeit, das Abonnement bei der Erstellung von ViewModel zu initialisieren? Damit kann ich eine öffentliche Initialisierungsfunktion vermeiden.

+0

Können Sie 'initSubscription' nicht einfach ausführen, wenn die' ViewModel' Konstruktorfunktion ausgeführt wird? – Jeroen

Antwort

0

Gibt es eine Möglichkeit, das Abonnement bei der Erstellung von ViewModel zu initialisieren?

Warum sicher. Einfach zwischen der Deklaration Ihres offenbarten Moduls abonnieren und es zurücksenden:

NameSpace.ViewModel = function(){ 
    var data; 
    var self = this; 
    var initSubscription = function(){ 
      NameSpace.Postbox.subscribe(function(newData){ 
       self.data = newData; 
      }, this, "New Data"); 
     }; 

    initSubscription(); // <-- does exactly what you ask 

    return { 
     data: data, 
     initSubscription: initSubscription // <-- might be superfluous now 
    } 
} 
+0

Ich habe es versucht, aber es hat nicht funktioniert. Denn 'this' verweist beim Aufruf der Subscribe-Funktion nicht auf das ViewModel. Übrigens verwende ich jetzt die Postbox-Erweiterung, das gleiche Ergebnis. Ich werde meinen Beitrag bearbeiten. – robbannn

+0

Ich habe meine Antwort für das 'this' Problem mit dem' var self = this; 'idiom angepasst. – Jeroen