我在这里关注发布/订阅同步的RN博客文章:
http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html
我的应用程序有一个' shell' viewModel具有各种内部viewModel,其中一个是'文件夹'。在文件夹viewmodel中,我列出了文件夹。
在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会快速切换clicked_add_folder属性,该文件夹已经订阅了.js。计算的observable检测到此更改并触发某些功能 - 添加文件夹。这是合理的解决方案吗?我希望避免找到一个能够解决问题的解决方案&#34 ;;我想学习如何正确地实现这个结果。
答案 0 :(得分:3)
我假设你正在使用ko.postbox
?如果是这种情况,我认为如果你只删除了observable并直接发布/订阅主题就会更清洁:< / p>
// 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/