拜托,有人可以帮我吗?
执行创建方法时出现以下错误:
*Uncaught TypeError: Object #<Object> has no method 'baseUri'*
从以下绑定调用此方法:
<form id="createProducts" data-bind="submit: products.create">
执行读取方法时,从 PreLoad 方法调用, baseUri 和项都可用
当视图模型被定义为函数时,我找到了这个问题的解决方案,但在我的情况下,它被定义为一个对象。
这是我的完整JS文件
var mm = {
/* Products ********************************************************** */
products: {
items: ko.observableArray([]),
read: function () {
$.getJSON(this.baseUri(), this.items);
},
create: function (formElement) {
$.post(this.baseUri(), $(formElement).serialize(), null, "json")
.done(function (o) {
alert("The Product " + o.Name + " was created.");
this.items.push(o);
});
},
baseUri: function () { return BASE_URI; }
}
};
function PreLoad() {
mm.products.read();
ko.applyBindings(mm);
}
谢谢!
答案 0 :(得分:0)
当您致电this
时,我感觉products.create
不是您的想象。尝试使用.bind
明确设置上下文:
<form id="createProducts" data-bind="submit: products.create.bind($data)">
答案 1 :(得分:0)
正如Andrew Whitaker已经提到的那样 - “这个”将不是您期望的背景。我的解决方案是存储“this”引用(例如称为“self”)并使用它代替“this”:
products: {
self: undefined,
items: ...,
init: function() {
this.self = this;
},
read: function () {$.getJSON(self.baseUri(), self.items);},
create: function () {
$.post(self.baseUri(), $(formElement).serialize(), null, "json")
.done(function (o) {
alert("The Product " + o.Name + " was created.");
self.items.push(o);
});
},
baseUri: function () { return BASE_URI; }
};
function PreLoad() {
mm.products.init();
mm.products.read();
ko.applyBindings(mm);
}
您还可以明确指出应在何种上下文中调用函数:
<form id="createProducts" data-bind="submit: function () { products.create($root.products); }">
products: {
create: function(self) {
...
}
在这种情况下,$ root应指向您的视图模型,因此您将传递产品对象的对象以创建函数。
答案 2 :(得分:0)
绑定事件时,有两种方法可以确保this
正确无误。
第一种是使用bind
:
<form id="createProducts" data-bind="submit: products.create.bind(products)">
第二种是使用内联函数:
<form id="createProducts" data-bind="submit: function() { products.create(); }">
这种行为可能会在将来发生变化(见https://github.com/SteveSanderson/knockout/issues/378)。
修改
有两种解决方案可以使this
在回调函数中可用。第一种是将this
复制到一个可通过闭包获得的局部变量。
var self = this;
$.post(this.baseUri(), $(formElement).serialize(), null, "json")
.done(function (o) {
alert("The Product " + o.Name + " was created.");
self.items.push(o);
});
第二种是在回调函数上使用bind
。
$.post(this.baseUri(), $(formElement).serialize(), null, "json")
.done(function (o) {
alert("The Product " + o.Name + " was created.");
this.items.push(o);
}.bind(this));