Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.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 self=在带有敲除的嵌套viewmodel中这种奇怪的行为_Javascript_Knockout.js - Fatal编程技术网

Javascript self=在带有敲除的嵌套viewmodel中这种奇怪的行为

Javascript self=在带有敲除的嵌套viewmodel中这种奇怪的行为,javascript,knockout.js,Javascript,Knockout.js,我正试图掌握knockout.js,但我似乎遇到了一个我不知道的javascript怪癖 Html 当我移除自我=这个;NestedViewModel中的行,我将self.number替换为this.number,一切正常!我不知道javascript在引擎盖下做什么。。。有人对此有解释吗?还有一个解决方案 您需要通过将var放在变量前面来声明这些变量。如果不声明它们,您将试图写入全局self,而大多数浏览器都不允许这样做。(如果不是因为浏览器中已经有一个名为self的全局代码,那么该代码将成为

我正试图掌握knockout.js,但我似乎遇到了一个我不知道的javascript怪癖

Html 当我移除自我=这个;NestedViewModel中的行,我将self.number替换为this.number,一切正常!我不知道javascript在引擎盖下做什么。。。有人对此有解释吗?还有一个解决方案


您需要通过将
var
放在变量前面来声明这些变量。如果不声明它们,您将试图写入全局
self
,而大多数浏览器都不允许这样做。(如果不是因为浏览器中已经有一个名为
self
的全局代码,那么该代码将成为
var
的牺牲品,并且仍然需要
var
——事实上,它是在以后的
i
中出现的)

例如:

函数嵌套视图模型(编号){
var self=这个;
//  ^^^
自身数量=可观察到的ko(数量);
}
函数ViewModel(){
var self=这个;
//  ^^^
self.someList=[];

对于(var i=0;i,除了@T.J.的答案之外,您可能还希望使数组成为可观察的

self.someList = ko.observableArray([]);

关于
这个
的最详细的解释,请看这里。aarrg!现在看起来很明显。我只是太习惯使用类型安全语言了,所以我不会马上注意到这些错误。希望“使用严格的”至少部分解决了这个问题。非常感谢!你是对的,但是很高兴知道选项在那里,也许我应该将其添加为注释。事实上,我将示例代码简化为最基本的部分来演示这个问题:)
function NestedViewModel(number) {
    self = this;
    self.number = ko.observable(number); 
}

function ViewModel() {
    self = this;
    self.someList = [];

    for (i=0;i<10;i++) {
        var vm = new NestedViewModel(i);
        self.someList.push(vm);
    }

}

ko.applyBindings(new ViewModel());
Uncaught TypeError: Cannot read property 'push' of undefined
function NestedViewModel(number) {
    var self = this;
//  ^^^
    self.number = ko.observable(number); 
}

function ViewModel() {
    var self = this;
//  ^^^
    self.someList = [];

    for (var i=0;i<10;i++) {
//       ^^^
        var vm = new NestedViewModel(i);
        self.someList.push(vm);
    }

}

ko.applyBindings(new ViewModel());
self.someList = ko.observableArray([]);