在我的Knockout代码中获取“变量未定义”

时间:2011-05-12 06:25:46

标签: javascript knockout.js

我不明白为什么下面的代码不断抛出“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();
}

我的观点工作正常,我需要的所有东西都没有问题,但是我无法弄清楚上面的问题。任何帮助将不胜感激。

1 个答案:

答案 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时,它将无法工作。