我不明白为什么下面的代码不断抛出“viewModel is undefined”错误,有人知道为什么吗?
我实际上认为这可能是KnockoutJS的一个问题,它希望viewModel是window的一个属性。它似乎是自定义命名空间的一部分,它不会识别它,因为window.viewModel
它工作正常!这是我运行的测试中的假设。这就是我在做的事情:
var myNamespace.fieldworker = {};
myNamespace.fieldworker.GetFields = function() {
var viewModel = {
people: [
new person("Annabelle", ["Arnie", "Anders", "Apple"]),
new person("Bertie", ["Boutros-Boutros", "Brianna", "Barbie", "Bee-bop"]),
new person("Charles", ["Cayenne", "Cleopatra"])
],
showRenderTimes: ko.observable(false)
};
ko.applyBindings(viewModel);
}
从ui页面(html)调用Document.ready,该页面调用此函数:
function Initialize(url) {
udfurl = url;
myNamespace.fieldworker.GetFields();
}
我的观点工作正常,我需要的所有东西都没有问题,但是我无法弄清楚上面的问题。任何帮助将不胜感激。
答案 0 :(得分:1)
Knockout可以正常传递viewModel的任何对象(不必具有全局范围)。但是,听起来你可能有一个带有数据绑定的元素,它直接引用viewModel变量而不是它的子节点。
以下是一个不起作用的示例:
<ul data-bind="template: { name: 'itemTmpl', foreach: items}"></ul>
<script id="itemTmpl", type="text/html">
<li>
<span data-bind="text: name"></span>
<button data-bind="click: function() { viewModel.removeItem($data); }">Delete</button>
</li>
</script>
$(function() {
var viewModel = {
items: ko.observableArray([{
name: "Bob"},
{
name: "Sue"}]),
addItem: function() {
this.items.push({
name: "New"
});
},
removeItem: function(item) {
this.items.remove(item);
}
};
ko.applyBindings(viewModel);
});
因此,在这种情况下,viewModel变量没有全局范围,因为它是在jQuery ready函数中定义的。当我们尝试在项目模板中使用viewModel.removeItem时,它将无法工作。