Javascript xxx不是我的ViewModel中的函数
为什么我会得到一个Javascript xxx不是我的ViewModel中的函数,javascript,knockout.js,Javascript,Knockout.js,为什么我会得到一个未捕获类型错误:this.createRow不是一个函数 关于矩阵的有效阵列构造 createRow函数在我的viewmodel末尾声明 function TabBuyHarvesterModel() { self = this; this.selectedEmote = ko.observable('kappa'); this.matrixLengthsAvailable = ko.observableArray([ { length
未捕获类型错误:this.createRow不是一个函数
关于矩阵的有效阵列构造
createRow
函数在我的viewmodel末尾声明
function TabBuyHarvesterModel() {
self = this;
this.selectedEmote = ko.observable('kappa');
this.matrixLengthsAvailable = ko.observableArray([
{ length: 10, pctDetails: this.createRow(10) /*ko.mapping.fromJS({ rowLength: 10 })*/ }
//30,
//60,
//180,
//360,
//720,
//1440
]);
this.selectEmote = function (emoteClicked) {
self.selectedEmote(emoteClicked.emote);
};
this.createRow = function (rowLength) {
var ret = new TabBuyHarvesterMatrixRowModel();
ret.rowLength(rowLength);
return ret;
};
}
由于ko.observearray()是一个函数,因此this.createRow中的此引用将引用obervablerray上下文,请将其更改为self。由于ko.observearray()是一个函数,因此this.createRow中的此引用将引用obervablerray上下文,将其更改为self。您正在尝试在创建之前使用
createRow
函数。在矩阵长度可用之前定义createRow
。更好的方法是在TabBuyHarvesterModel
原型上定义createRow
。这将在类实例化之前一次性定义函数
function TabBuyHarvesterModel() {
...
}
TabBuyHarvesterModel.prototype.createRow = function (rowLength) {
var ret = new TabBuyHarvesterMatrixRowModel();
ret.rowLength(rowLength);
return ret;
};
您试图在创建
createRow
函数之前使用它。在矩阵长度可用之前定义createRow
。更好的方法是在TabBuyHarvesterModel
原型上定义createRow
。这将在类实例化之前一次性定义函数
function TabBuyHarvesterModel() {
...
}
TabBuyHarvesterModel.prototype.createRow = function (rowLength) {
var ret = new TabBuyHarvesterMatrixRowModel();
ret.rowLength(rowLength);
return ret;
};
正如前面所指出的,您应该使用self,并正确地使用它,就像在everywhere中一样,然后您需要切换方法的顺序,以便在需要之前定义createRow 在这里:
}如前所述,您应该使用self,并正确地使用它,就像在everywhere中一样,然后您需要切换方法的顺序,以便在需要之前定义createRow 在这里:
}如果只从内部引用
TabBuyHarvesterModel
,那么只需将其作为普通的旧函数即可。此外,如果您这样做,那么您就不必在矩阵lengthsavailable
可观察之前定义createRow
,因为JavaScript总是将函数提升到闭包的顶部,即使它们没有在闭包的顶部定义:
function TabBuyHarvesterModel() {
self = this;
this.selectedEmote = ko.observable('kappa');
this.matrixLengthsAvailable = ko.observableArray([
{ length: 10, pctDetails: createRow(10) /*ko.mapping.fromJS({ rowLength: 10 })*/ }
//30,
//60,
//180,
//360,
//720,
//1440
]);
this.selectEmote = function (emoteClicked) {
self.selectedEmote(emoteClicked.emote);
};
function createRow(rowLength) {
var ret = new TabBuyHarvesterMatrixRowModel();
ret.rowLength(rowLength);
return ret;
}
}
如果您仅从内部引用
createRow
,则只需将其设置为普通的旧函数即可。此外,如果您这样做,那么您就不必在矩阵lengthsavailable
可观察之前定义createRow
,因为JavaScript总是将函数提升到闭包的顶部,即使它们没有在闭包的顶部定义:
function TabBuyHarvesterModel() {
self = this;
this.selectedEmote = ko.observable('kappa');
this.matrixLengthsAvailable = ko.observableArray([
{ length: 10, pctDetails: createRow(10) /*ko.mapping.fromJS({ rowLength: 10 })*/ }
//30,
//60,
//180,
//360,
//720,
//1440
]);
this.selectEmote = function (emoteClicked) {
self.selectedEmote(emoteClicked.emote);
};
function createRow(rowLength) {
var ret = new TabBuyHarvesterMatrixRowModel();
ret.rowLength(rowLength);
return ret;
}
}
this
引用对象{length:10,pctDetails:this.createRow(10)}
,使用self
(除非它是您期望的可观察数组的上下文,不熟悉敲除)@gillesc我也尝试了self
,但得到了相同的错误this
引用对象{length:10,pctDetails:this.createRow(10)}
,使用self
(除非它是您期望的可观察数组的上下文,不熟悉敲除)@gillesc我也试过self,但得到了同样的错误我也试过self,我得到了self.createRow不是一个函数我想实际上是因为函数还没有定义。ko.observable()正在立即被调用,因此尝试立即调用createRow。但由于您的函数定义在构造函数本身中,而不是在原型上,因此每次调用构造函数时都必须创建这些函数。请将这些函数定义附加到原型,或在调用ko.obser之前定义它们vableI也尝试了self,我得到了self.createRow不是一个函数
我认为实际上是因为函数还没有定义。ko.observable()正在立即被调用,因此尝试立即调用createRow。但由于您的函数定义在构造函数本身中,而不是在原型上,因此每次调用构造函数时都必须创建这些函数。请将这些函数定义附加到原型,或在调用ko.obser之前定义它们VableThank…该死的,我想了想,但没有费心去尝试,因为我认为这太荒谬了…谢谢…该死的,我想了想,但没有费心去尝试,因为我认为这太荒谬了…没有理由到处使用self
。我发现只有在需要时才使用self
他把代码写得更清楚了。是的,使用self
的原因是什么this
在哪里工作?我已经觉得必须这样做很愚蠢;var self=this;lol如果我可以的话,我会尽量避免它。在这段代码中,self唯一需要的地方是在selectEmote
函数中。这取决于它的调用方式。没有到处使用self
的理由。我发现只有在需要时才使用self
才能使代码更清晰。是的,使用self
的理由是什么这个在哪里工作?我已经觉得必须这样做很愚蠢;
lol如果我能在这个代码中找到唯一的位置,我会尽量避免它可能需要重新设置self,具体取决于调用方式。