我有一个非常简单的例子。
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)未定义
目标:返回被调用对象的Name-Property - 我想使用x作为属性,以便我可以使用任何具有可观察名称属性的Object调用此函数
代码说明: 这是使用带有knockout.js的揭示模块模式完成的。 Name-property是一个ko.observable() - 所以需要()。
问题:为什么x未定义?
答案 0 :(得分:3)
我问你。您认为x在哪里被定义?
您正在调用getName并传递Customer,但getName不期望参数。
如果您像这样重写您的功能,它将起作用:
var getName = function(x) { return ko.computed( function() {
return x.Name();
})};
答案 1 :(得分:1)
您正在尝试更改可观察“getName”的值,但由于它是计算值,因此在您指定应如何处理之前,这是未定义的行为。
我认为最好的解决方案是引入另一个存储客户的观察点。
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)