Knockout.js 使用敲除功能跨viewModels访问函数?

Knockout.js 使用敲除功能跨viewModels访问函数?,knockout.js,durandal,Knockout.js,Durandal,下面是RN关于发布/订阅同步的博文: 我的应用程序有一个带有各种内部视图模型的“shell”视图模型,其中一个是“folder”。在文件夹viewmodel中,我列出了文件夹 从shell的菜单栏,我需要能够添加另一个文件夹。这就是我现在实现它的方式: 在shell.js中: this.clickedAddFolder = ko.observable(false).publishOn("CLICKED_ADD_FOLDER"); this.addFolder = function () { c

下面是RN关于发布/订阅同步的博文:

我的应用程序有一个带有各种内部视图模型的“shell”视图模型,其中一个是“folder”。在文件夹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将快速切换folder.js已订阅的clicked_add_folder属性。一个计算的可观察对象检测到这个变化并触发一些函数-添加一个文件夹。这是一个合理的解决方案吗?我希望避免找到“有效”的解决方案;我想学习如何正确地实现这个结果

我假设您正在使用,如果是这样的话,我认为如果您只是删除可观察对象并直接发布/订阅主题会更干净一些,如下所示:

// 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();
});

这是一个没有实际加载邮箱的JSFIDLE,但我基本上只是从邮箱中删除了两个必要的函数:

我实际上是在没有ko.postbox的情况下完成的-我永远无法让它工作。我刚刚添加了10行代码,以使publishOn和subscribeTo绑定正常工作。我确实通过安装ko postbox尝试了您的方法,但遇到了一个错误,说ko没有方法“postbox”,所以我恢复了我的更改。@Robbouse您加载脚本的顺序是什么?敲除必须在postbox之前加载,而postbox必须在代码尝试使用它之前加载。不管是哪种方式,我都会尝试制作一个示例来演示如何在没有邮箱的情况下实现这一点。@RobVious我刚刚更新了一个指向JSFIDLE的链接,演示了邮箱代码的重要部分。让我知道如果我能进一步澄清。JFY:你甚至可以考虑使用原生DurDalb PUB/SUB,而不是维护自己的10行代码;