【发布时间】:2015-09-29 07:18:32
【问题描述】:
我正在尝试在 knockout 中创建自定义组件加载器,但我在视图模型方面遇到了困难。本质上,我想远程获取 HTML 模板和 JavaScript 视图模型,但在这种情况下,我不想使用传统的 AMD 模块加载器。
我已经设法完成了其中的一些工作,特别是加载 HTML 模板,但我不知道如何加载视图模型。在我开始之前,这是我的目录结构:
-- index.html
-- customerLoader.js
-- 组合
-- myCustom.html
-- myCustom.js
所以我已经像这样创建了我的组件加载器。 getConfig 基本上采用组件的名称并将其转换为 viewModel 和 html 模板的路径。
var customLoader = {
getConfig: function(name, callback) {
callback({ template: "comps/" + name + ".html", viewModel: "comps/" + name + ".js" });
},
loadTemplate: function(name, templateConfig, callback) {
console.log("loadTemplate", name, templateConfig);
$.get(templateConfig, function(data) {
callback(data);
});
},
loadViewModel: function(name, templateConfig, callback) {
console.log("loadViewModel", name, templateConfig);
$.getScript(templateConfig, function(data) {
callback(data);
});
}
};
ko.components.loaders.unshift(customLoader);
这成功地发出了加载模板的请求,这会带回一些基本内容。我正在努力解决的是视图模型。我不确定我的 JavaScript 文件的目标应该是什么?
我假设我想返回一个带有一些参数的函数,很可能是一个params 对象。但是,如果我尝试这样做,我会收到一个错误,告诉我 JavaScript 无效:
Uncaught SyntaxError: Illegal return statement
这是产生此错误的当前内容:
return function(params) {
console.log("myCustom.js", name, viewModelConfig);
// Add a computed value on
params.bookNum = ko.computed(function() {
switch(this.title()) {
case "A": return 1;
case "B": return 2;
case "C": return 3;
default: return -1;
}
});
//ko.components.defaultLoader.loadViewModel(name, viewModelConstructor, callback);
};
所以最终我不确定如何实现这一点,但我想有 3 个基本问题可以解释我的理解差距:
- 我的“视图模型”JavaScript 文件应该包含什么?一个函数?一个东西?等等……
- 我需要拨打
ko.components.defaultLoader.loadViewModel吗? - 在我的
customLoader中,loadViewModel()应该如何处理 jQuery 回调的结果?我不确定我是返回一个 JavaScript 对象,还是只是一个字符串?
如果需要,我愿意以不同的方式实现这一点(例如,不使用 jQuery 而是以不同的方式获取文件),但我不想使用模块加载器(例如 require.js/curl.js在这种情况下)。
【问题讨论】:
-
您的脚本不应以
return开头。应该是可以独立执行的代码。