2

我有一个非常简单的例子,它不起作用。

jsfiddle:http: //jsfiddle.net/ThomasDeutsch/8hzhp/3/

// My Model
function Customer(id, name, lastname) {
    this.Id = ko.observable(id);
    this.Name = ko.observable(name);
    this.LastName = ko.observable(lastname);
}

// My ViewModel
ViewModel = (function () {
    var getName = ko.computed(function (x) {
        return x.Name();
    });

    return {
        getName: getName(new Customer(1, "Thomas", "D"))
    };
})();

ko.applyBindings(ViewModel);​

问题:参数(x)未定义

目标:返回被调用对象的名称属性 - 我想使用 x 作为属性,以便我可以使用任何具有可观察名称属性的对象调用此函数

代码说明:这是使用带有 knockout.js 的显示模块模式完成的。Name-property 是一个 ko.observable() - 所以需要 ()。

问题:为什么 x 未定义?

4

2 回答 2

3

让我问问你。你认为 x 是在哪里定义的?

您正在调用 getName 并传递一个客户,但 getName 不需要参数。

如果你像这样重写你的函数,它将起作用:

var getName = function(x) { return ko.computed( function() {
    return x.Name();
})};
于 2012-06-03T19:38:16.463 回答
1

您正在尝试更改可观察的“getName”的值,但由于它是计算出来的,因此在您指定应如何处理之前,这是未定义的行为。

我认为最好的解决方案是引入另一个存储客户的 observable。

var ViewModel = (function() {
    // Observable for the customer
    var customer = ko.observable(new Customer(1, "Thomas", "D"));

    // The computed observable, using the other one
    var getName = ko.computed(function() {
        return customer().Name();
    });

    // If you only need to access the name, its sufficient
    // to export only that observable. However, this is still
    // read-only.
    return {
        getName: getName
    };
})();

如果你想让它可写,你可以为计算的 observable 定义一个 setter:

var getName = ko.computed({
    read: function() {
        return customer().Name();
    },
    write: function(n) {
        customer().Name(n);
    }
});

(这不是一个最有意义的例子,但那是因为你在这里并不需要计算的 observable)

于 2012-06-03T19:41:45.670 回答