4

我正在处理淘汰赛并且遇到了一个我不知道如何解决的问题。我从 asp.net mvc 控制器中检索了一个 json 对象。我将它传递给以下函数:

load = function (data) {
        var myViewModel = function () {
            var self = this;

            ko.mapping.fromJS(data, self);

            self.hasItems = ko.computed(function () {
                return self.NumberOfItems > 0;
            }, self);

        };
        ko.applyBindings(myViewModel, window.document.getElementById("my-container"));
    }

我正在根据 json 中返回的内容向模型对象添加自定义行为,特别是 json 的 NumberOfItems 属性。我的标记是:

 <div class="content" style="display: none;" data-bind="visible: hasItems === false">
    <span class="empty">My Items</span>
</div>

但我不断收到此错误:

错误:无法解析绑定。消息:ReferenceError:hasItems 未定义;绑定值:可见:hasItems === false

我不知道为什么-我是新手,所以真的很感谢任何帮助?

4

3 回答 3

2

applyBindings 需要一个对象。尝试

ko.applyBindings(new myViewModel(), window.document.getElementById("my-container"));

此外,当您想要获取 observable 的值时,您需要使用括号。

return self.NumberOfItems() > 0;

http://jsfiddle.net/36xtR/

于 2013-02-20T21:05:58.693 回答
0

您看到的错误“无法解析绑定”意味着淘汰赛找不到您要绑定的内容(hasItems)。

我认为这是因为您仅在调用 load 函数时才创建 viewModel,但在解析绑定时 viewModel 不存在,因此它会抱怨。

我会尝试设置你的 viewModel 更像这样:

var myViewModel = function () {
        var self = this;

        self.load = function (data) {
            ko.mapping.fromJS(data, self);
        }

        self.hasItems = ko.computed(function () {
            return self.NumberOfItems > 0;
        }, self);

    };
ko.applyBindings(new myViewModel(), window.document.getElementById("my-container"));

然后,您可以在 viewModel 中调用加载函数来代替您调用当前加载函数的位置。

于 2013-02-20T21:29:39.230 回答
0

除了 ckal 答案,您可能还想以这种方式使用 ko.mappings :

ko.mapping.fromJS(data, {}, self);  
于 2013-02-20T21:14:35.473 回答