【问题标题】:KnockoutJS custom component loader not executing `loadViewModel`KnockoutJS 自定义组件加载器不执行`loadViewModel`
【发布时间】:2015-09-07 15:01:16
【问题描述】:

上下文

我一直在摆弄并尝试创建自己的(只是另一个)SPA 框架。在这个框架中,我一直在尝试创建一个自定义组件加载器,以便能够在我正在加载的视图模型上执行一些依赖注入。

使用的 KnockoutJS 版本:3.3.0

问题

加载组件时自定义组件加载器上的loadViewModel 函数未执行。

参考代码(see file):

injector(function (ko) {
    ko.components.loaders.unshift({
        getConfig: function (name, callback) {
            var parts = name.split("/");
            callback({
                require: "components/" + name + "/" + parts[parts.length - 1]
            });
        },
        loadViewModel: function (name, viewModelConfig, callback) {
            console.log(arguments);
            callback(null);
        }
    });
});

请注意injector 函数只是我编写的一些自定义依赖解析器。 (几乎就像对 AMD 组件的 definerequire 调用。)

getConfig 函数无论如何都会正确执行。

如需全面了解我的涂鸦,请see this git repo

【问题讨论】:

  • 在您的viewModel.js 中,viewModel: func.apply(this.models[identifier], arguments) 未正确设置仍保留为undefined 的viewModel 属性,因为默认组件的loadComponent 方法不会调用您的loadViewModel 方法.因此,您需要从 viewModel.js 返回正确的 viewModel 对象/函数
  • @nemesv 请将其作为答案提交,以便我接受它,因为我相信这是根本原因。无论如何,关于如何让 viewModel 实际上返回它的 viewModel 有什么想法吗?

标签: javascript knockout.js requirejs knockout-components


【解决方案1】:

如果您不“覆盖”loadComponent 方法,则默认组件加载器的 loadComponent 将被调用,如果您提供了 viewModel 配置选项,它将仅调用 loadViewModel

在您的 getConfig 方法中,您将返回一个带有 require 的配置,这意味着您的 require.js 模块必须提供必要的 viewModel 配置选项。

不过在你的viewModel.js

viewModel: func.apply(this.models[identifier], arguments) 

没有正确设置 viewModel 属性,而该属性仍然是 undefined

【讨论】:

  • 感谢您花时间浏览我的代码。您答案中的最后一句话可能是为同样问题苦苦挣扎的人的最佳指针:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多