2013-04-30 68 views
1

我下面這篇文章:可觀測陣列,淘汰賽發佈/訂閱

http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html

,讓我的虛擬機與其他溝通的一個。我的一個viewModel有一個我需要暴露給另一個viewModel的數組。如果這個數組不是可觀察的,那麼上面的帖子中的方法工作得很好。

如果數組是可觀察數組,那麼publishedSelectedFolders永遠不會被填充。我試圖弄清楚爲什麼;希望這是我正在做的傻事。

這裏是我的jsfiddle:

http://jsfiddle.net/PTSkR/40/

如果取消註釋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); 

回答

0

ko.utils.array...助手展開觀測自動(見source on github)。所以你需要直接將它們傳遞給已經打包好的數組而不是observableArray

因此錯誤是在你的arrayForEach通話,這樣的正確用法是:

ko.utils.arrayForEach(viewModel.documents(), function(doc) { 
    viewModel.documentIndex[doc.documentId] = doc; 
}); 

注意()viewModel.documents()的結束,以及你是如何在ko.utils.arrayMap正確使用的viewModel.selectedDocumentIds()

您的固定JSFiddle

+0

謝謝。我在我的項目中嘗試了這個,但它不工作,我不能在jsFiddle上重現問題。在我的項目中,「文件夾」是一個可觀察的viewModel數組,每個都有一個屬性folderId。這些是由ko映射插件製作而成的。任何想法還有什麼可以進行? – SB2055 2013-04-30 20:39:40

+0

您是否設法找出實際代碼中存在的問題? – nemesv 2013-04-30 20:52:42

+0

即將發佈。我只需引用屬性作爲unwrapped observables - folder.id()而不是folder.id。非常感謝 :) – SB2055 2013-04-30 20:54:10