使用knockout访问viewModel中的函数?

时间:2013-05-28 00:44:10

标签: knockout.js durandal

我在这里关注发布/订阅同步的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 ;;我想学习如何正确地实现这个结果。

1 个答案:

答案 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/