Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript xxx不是我的ViewModel中的函数_Javascript_Knockout.js - Fatal编程技术网

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,具体取决于调用方式。