【发布时间】:2016-04-10 20:43:02
【问题描述】:
我有以下 html/js 现有工作代码,我想将它们提取到他们自己的文件中并使用 require.js 加载它们。
我的目标是将其组件化以便能够在其他地方使用它。
.html
...
<ul data-bind="foreach: selectedExams">
<li>
<select data-bind="options: $parent.availableExams, optionsText: 'examTypeName', optionsValue:'examTypeId', value: examtype"></select>
<select data-bind="options: exams, optionsText: 'examName', optionsValue:'examId',value: exam, enable:exams().length"></select>
<a href="#" data-bind="click: $parent.remove">Remove</a>
</li>
</ul>
<button data-bind="click: add">Add</button>
...
.js
var self = this;
...
self.availableExams = [...];
self.selectedExams = ko.observableArray([new selectedExam(self)]);
self.add = function () {
self.selectedExams.push(new selectedExam(self));
};
self.remove = function (exam) { self.selectedExams.remove(exam) }
...
起初看起来很简单,但我很困惑,因为视图模型似乎需要完全重写。
因为我想试验一下,看看它是如何工作的,在docs 之后,我创建了一个单独的 .html 文件,其中包含上面显示的所需内容。
还有以下自治的 .js 文件:
function ExamControlViewModel()
{
var self = this;
self.availableExams = [...];
self.selectedExams = ko.observableArray([new selectedExam(self)]);
self.add = function () {
self.selectedExams.push(new selectedExam(self));
};
self.remove = function (exam) { self.selectedExams.remove(exam) }
}
ko.applyBindings(new ExamControlViewModel());
接下来,我从原始 html/js 文件中删除了代码,并将以下内容添加到 js 文件中:
ko.components.register('exam-control', {
viewModel: { require: 'exam-control-viewmodel' },
template: { require: 'text!exam-control-view.html' }
})
它在运行时失败并出现以下错误:
“文本”的脚本错误,需要:text!exam-control-view.html_unnormalized2 http://requirejs.org/docs/errors.html#scripterror
显然我没有抓住重点,这不可能那么简单......可能吗?
任何指导表示赞赏。
编辑 1:
我遵循@JotaBe 的优秀指导,最终得到以下结果:
.js 文件
define([],function() {
function ExamControlViewModel()
{
var self = this;
self.availableExams = [...];
self.selectedExams = ko.observableArray([new selectedExam(self)]);
self.add = function () {
self.selectedExams.push(new selectedExam(self));
};
self.remove = function (exam) { self.selectedExams.remove(exam) }
}
return ExamControlViewModel;
});
html 文件: => 开头
...
<script type='text/javascript' src='Scripts/knockout-3.4.0.js'></script>
<script type='text/javascript' src='Scripts/knockout.validation.js'></script>
<script type='text/javascript' src='Scripts/require.js'></script>
<script type='text/javascript' src='Scripts/text.js'></script>
...
=>组件代码被替换为(提问的时候忘了说)
<exam-control></exam-control>
现在在运行时,出现以下错误:
不匹配的匿名 define() 模块
随着我的进步,我会再次更新这个帖子。
【问题讨论】:
标签: knockout.js requirejs components