1

私はこの投稿をフォローしています:

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

私のVMの1つが他のVMと通信できるようにします。ビューモデルの 1 つに、別のビューモデルに公開する必要がある配列があります。この配列がオブザーバブルでない場合、上記の投稿のメソッドは問題なく機能します。

配列が監視可能な配列である場合、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