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);
4

1 回答 1

0

ko.utils.array...助手不会自动解开 observables(参见github 上的源代码)。因此,您需要将已经解包的数组传递给它们,而不是observableArray直接传递给它们。

所以错误在你的arrayForEach电话中,正确的用法是:

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

注意()末尾的viewModel.documents(),以及您如何正确使用viewModel.selectedDocumentIds()中的ko.utils.arrayMap

你固定的JSFiddle

于 2013-04-30T19:40:47.717 回答