初始化为可观察对象的字段能否成为knockout.js中的数组?

初始化为可观察对象的字段能否成为knockout.js中的数组?,knockout.js,Knockout.js,我正在阅读一个现有的代码。最初,代码初始化属性“Data”: self.Data = ko.observable({}); 但之后,在某些函数中,代码会将“数据”分配给如下内容。self.Data未设置为ObservalArray,但在下面,它通过数组按原样使用。没有其他代码在这一行之前触及self.Data,所以当它在赋值之前触及这一行时,它仍然是一个ko.observable({}) 我认为这是一种合法的语法,用于将可观察对象转换为knockout.js中的数组,但如果我尝试立即为其长度设

我正在阅读一个现有的代码。最初,代码初始化属性“Data”:

self.Data = ko.observable({});
但之后,在某些函数中,代码会将“数据”分配给如下内容。self.Data未设置为ObservalArray,但在下面,它通过数组按原样使用。没有其他代码在这一行之前触及self.Data,所以当它在赋值之前触及这一行时,它仍然是一个ko.observable({})

我认为这是一种合法的语法,用于将可观察对象转换为knockout.js中的数组,但如果我尝试立即为其长度设置一个警报,如alert(self.Data().length),它是未定义的


我的问题是这段代码实际上做了什么

它不是一个可观察的数组。它是一个物体。使用javascipt对象,您可以通过点表示法或索引表示法访问它的属性

因为javascript是动态类型化的,所以可以向现有对象添加新属性

下面的代码实际上只是向现有对象实例添加了一个新的可观察属性

self.Data()[0] = ko.observable("");
这里有一个例子,希望能帮助你想象发生了什么。
var vm=function(){
var self=这个;
self.data=ko.observable({});
self.dataString=ko.computed(函数(){return JSON.stringify(self.data(),null,2);});
self.propertyName=ko.observable(0);
self.propertyValue=ko.observable('someValue');
self.update=函数(){
//这将添加新属性或更新self.data observable引用对象的现有属性。
//该属性的名称将是self.propertyName observable的值,该值将是在UI的第一个文本框中键入的值。
//属性的值将是self.propertyValue observable的值,该值将被输入到UI的第二个文本框中。
self.data()[self.propertyName()]=self.propertyValue();
//需要强制更新,因为观察到的数据没有直接修改
self.data.valueHasMutated();
};
self.replace=函数(){
//用新对象替换现有值
变量数据={};
数据[self.propertyName()]=self.propertyValue();
自我数据(数据);
};
}
$().ready(函数()){
应用绑定(新vm());
});

属性名称
属性值
更新 替换
self.data observable表示为json字符串:
我不确定self.Data=ko.observable({});是可观察对象的有效语法。我会用这种方式初始化一个可观察的耳环嗨,亚伦,对不起,我有点困惑。基于您提供给我的链接,您可以使用索引表示法在JavaScript中动态添加属性。但在我的示例(和您的示例)中,我似乎无法确定数据的新属性名是什么。谢谢。等等,我想你是说在你的示例self.data()[self.propertyName()]中,属性名是一个可观察的对象?或者只是新的属性是一个可观察的对象;没有物业名称?在我的示例中如何?它不是数据的新属性名,而是添加到数据可观察引用的对象中的名为0的属性。self.data()[self.propertyName()]并不意味着属性名是可观察的。self.propertyName()取消对可观察对象的装箱并返回基础值。在本例中,它将是在ui的第一个文本框中键入的内容。
self.Data()[0] = ko.observable("");