Knockout 2.0 does include functionality that lets you do basic pub/sub. Here is a sample where two view models communicate through a mediator.
var postbox = new ko.subscribable();
var ViewModelOne = function() {
this.items = ko.observableArray(["one", "two", "three"]);
this.selectedItem = ko.observable();
this.selectedItem.subscribe(function(newValue) {
postbox.notifySubscribers(newValue, "selected");
});
};
var ViewModelTwo = function() {
this.content = ko.observable();
postbox.subscribe(function(newValue) {
this.content(newValue + " content");
}, this, "selected");
};
ko.applyBindings(new ViewModelOne(), document.getElementById("choices"));
ko.applyBindings(new ViewModelTwo(), document.getElementById("content"));
The first view model notifies through the postbox on a specific topic and the second view model subscribes to that topic. They have no direct dependency on each other.
Certainly the postbox would not need to be global and could be passed into the view model constructor functions or just created inside a self-executing function.
Sample: http://jsfiddle.net/rniemeyer/z7KgM/
Also, the postbox
could just be a ko.observable
(which includes the ko.subscribable
functions).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…