2

我在这里关注 RN 关于发布/订阅同步的博文:

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

我的应用程序有一个带有各种内部视图模型的“外壳”视图模型,其中一个是“文件夹”。在文件夹视图模型中,我列出了文件夹。

从 shell 的菜单栏中,我需要能够添加另一个文件夹。这就是我现在实现它的方式:

在 shell.js 中:

this.clickedAddFolder = ko.observable(false).publishOn("CLICKED_ADD_FOLDER");
this.addFolder = function () { clickedAddFolder(true); clickedAddFolder(false); };

然后在 folder.js 中:

var clickedAddFolder = ko.observable().subscribeTo("CLICKED_ADD_FOLDER");
innerModel.addFolder = ko.computed(function() {
                if (clickedAddFolder()) {
                    var folder = new folderViewModel(addFolderDto);
                    innerModel.folders.push(folder);
                    refreshIsotope();
                }
            }).bind(this);

这个想法是 shell.js 将快速切换 folder.js 订阅的 clicked_add_folder 属性。一个计算出的 observable 检测到这个变化并触发一些功能——添加一个文件夹。这是一个合理的解决方案吗?我想避免找到“有效”的解决方案;我想学习如何正确地达到这个结果。

4

1 回答 1

3

我假设你正在使用ko.postbox? 如果是这种情况,我认为如果您只是删除 observables 并直接发布/订阅主题,如下所示:

// shell.js
this.addFolder = function addFolder(e) {
    // 'Add Folder' clicked, publish on the topic
    ko.postbox.publish('CLICKED_ADD_FOLDER', e);
};

//folder.js
ko.postbox.subscribe('CLICKED_ADD_FOLDER', function onClickedAddFolder(e) {
    var folder = new folderViewModel(addFolderDto);
    innerModel.folders.push(folder);
    refreshIsotope();
});

这是一个没有实际加载邮箱的 JSFiddle,但我基本上只是从邮箱中删除了两个必要的功能:http: //jsfiddle.net/QqBhk/

于 2013-05-28T02:42:28.003 回答