我下面這篇文章:可觀測陣列,淘汰賽發佈/訂閱
http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html
,讓我的虛擬機與其他溝通的一個。我的一個viewModel有一個我需要暴露給另一個viewModel的數組。如果這個數組不是可觀察的,那麼上面的帖子中的方法工作得很好。
如果數組是可觀察數組,那麼publishedSelectedFolders永遠不會被填充。我試圖弄清楚爲什麼;希望這是我正在做的傻事。
這裏是我的jsfiddle:
如果取消註釋VM中的線,它按預期工作(publishedSelectedFolders填充作爲檢查打勾)。這是爲什麼發生?
代碼:
/*
* Pub/Sub (decouples VMs but lets them access each others' data)
*/
var postbox = new ko.subscribable();
ko.subscribable.fn.publishOn = function (topic) {
this.subscribe(function (newValue) {
postbox.notifySubscribers(newValue, topic);
});
return this; //support chaining
};
ko.subscribable.fn.subscribeTo = function (topic) {
postbox.subscribe(this, null, topic);
return this; //support chaining
};
/* Selection code */
this.publishedSelectedFolders = ko.observableArray().subscribeTo("SELECTED_FOLDERS");
var vm = {
folders: ko.observableArray([{
"folderId": "1"
}, {
"folderId": "2"
}]),
// folders: [{"folderId": "1"}, {"folderId": "2"}, {"folderId": "3"}],
selectedFolderIds: ko.observableArray(),
};
vm.folderIndex = {};
ko.utils.arrayForEach(vm.folders, function (folder) {
vm.folderIndex[folder.folderId] = folder;
});
/* monitors selections and publishes to the shell */
this.selectedFolders = ko.computed(function() {
return ko.utils.arrayMap(vm.selectedFolderIds(), function (id) {
return vm.folderIndex[id];
});
}).publishOn("SELECTED_FOLDERS");
ko.applyBindings(vm);
謝謝。我在我的項目中嘗試了這個,但它不工作,我不能在jsFiddle上重現問題。在我的項目中,「文件夾」是一個可觀察的viewModel數組,每個都有一個屬性folderId。這些是由ko映射插件製作而成的。任何想法還有什麼可以進行? – SB2055 2013-04-30 20:39:40
您是否設法找出實際代碼中存在的問題? – nemesv 2013-04-30 20:52:42
即將發佈。我只需引用屬性作爲unwrapped observables - folder.id()而不是folder.id。非常感謝 :) – SB2055 2013-04-30 20:54:10