我在Knockout中也是新手。现在我正在尝试将我的Knockout视图模型集成到Reuire.js架构中。
我有5个js文件:
这就是我从index.html调用require.js的方法:
<script data-main="/scripts/app" src="/scripts/require.js"></script>
这是入口点脚本app.js:
require.config({
baseUrl: "/scripts",
paths: {
"jquery": "jquery-2.0.3",
"knockout": "knockout-2.2.0",
"MyViewModel": "./ko-model/MyViewModel"
}
});
require([
"jquery",
"knockout",
"MyViewModel"
],
function ($, ko, MyViewModel) {
// LOGIC:
$(function () {
ko.applyBindings(
new MyViewModel(),
$("#myId")
);
});
});
这是MyViewModel.js模块:
define(
'MyViewModel',
["knockout"],
function (ko) {
return function MyViewModel() {
// MyViewModel implementation
...
};
});
这对我来说很好。但
正如你在app.js中看到的那样,我有:
function ($, ko, MyViewModel) {
// LOGIC:
$(function () {
ko.applyBindings(
new MyViewModel(),
$("#myId")
);
});
}
我不喜欢这个。我宁愿不要在这里使用jQuery并以某种方式指定knockout上下文:
function ($, ko, MyViewModel) {
// LOGIC:
ko.applyBindings(
new MyViewModel(),
document.getElementById("myId")
);
}
但在这种情况下,敲除绑定不起作用。似乎 document.getElementById(“myId”) 在这里不起作用。我不知道为什么。 (我最好的猜测是,当ko.applyBindings()调用时,文档尚未加载。
因此我有下一个问题:
如何在LOGIC部分中使用jQuery进行转义,但是仍然指定了敲除上下文?
我希望有任何改进我的代码的建议。
答案 0 :(得分:1)
是的,它无法找到id,因为很可能文档还没有完成加载。如果<script>
位于<head>
,则很可能会出现此问题。您需要友好的解决方案是domReady plugin。来自文档:
require(["jquery", "knockout", "MyViewModel", "domReady"],
function($, ko, MyViewModel, domReady) {
domReady(function () {
// your code here, document is initialized
});
});