Javascript 订阅淘汰ObservalArray但显示空数组的数据
我是javascript新手。我很难从Array位置打印数据。数据绑定可以工作,我可以在视图中的位置ObservableArray列出数据,但无法在控制台上打印出来。我已经用了好几个小时了,如果有任何帮助,我将不胜感激。多谢各位 这是ViewModelJavascript 订阅淘汰ObservalArray但显示空数组的数据,javascript,knockout.js,knockout-mvc,Javascript,Knockout.js,Knockout Mvc,我是javascript新手。我很难从Array位置打印数据。数据绑定可以工作,我可以在视图中的位置ObservableArray列出数据,但无法在控制台上打印出来。我已经用了好几个小时了,如果有任何帮助,我将不胜感激。多谢各位 这是ViewModel let MapViewModel = function() { let map let geocoder; let self = this; self.location = ko.observableArray([]); for (
let MapViewModel = function() {
let map
let geocoder;
let self = this;
self.location = ko.observableArray([]);
for (let i = 0; i < locationList.length; ++i) {
self.location.push(new Location(locationList[i]));
}
console.log(this.location()); // Location, Location, Location, Location, Location, Location, Location]
console.log(this.location()[0].name); // Location {name: ƒ, address: ƒ} ...
console.log(this.location().length); //length is 7
}
let Location = function(data) {
this.name = ko.observable(data.name);
this.address = ko.observable(data.address);
}
ko.applyBindings(new MapViewModel());
这可以将observable展开为常规js,并将其转换为单个字符串(如果需要),然后您可以在控制台中打印它:
let locationsJSON = ko.toJS(self.location);
let locationsString = JSON.stringify(locationsJSON);
locationList
看起来像什么?它是一个对象数组,其属性为名称和地址。谢谢你当你说你不能在控制台上打印时那是什么意思?这会给你一个错误吗?它的格式是否不正确?不,它不显示任何错误。当我尝试使用这行代码“console.log(self.Location()[0]);”打印ObservalArray中的第一个对象时,它会显示“Location{name:ƒ,address:ƒ}”。我不知道这是什么意思,我需要像这样的“地点{name:“New york”,address:“E98St”}。谢谢你刚刚试过,它成功了。非常感谢。请你指出我在代码中犯的错误,这样我将来就能知道如何处理类似的问题。谢谢没有错误。当你做this.name=ko.observeable时(data.name);
它将data.name包装到函数(可观察)中,以向其添加附加功能(例如订户侦听器)。当您记录console.log(this.location()[0].name);
时,它说name是函数,因为它实际上是一个函数(ko-observable)。若要展开单个可观察变量,可以在可观察变量名称后面使用括号,如console.log(this.location()[0].name())如果有嵌套的,你需要使用ko.toJS
或ko.mapping.toJS
,它会将你所有的观察值转换成常规的json。哦,我的天啊!!再次感谢你,我一点都没想到。你刚刚帮我省去了很多压力。谢谢你much@FredBrume如果答案适用于你,考虑投票并标记为ANSW。呃。
let locationList = [{
name: 'Brooklyn Museum',
address: '200 Eastern Pkwy, Brooklyn, NY 11238'
}, {
name: 'Empire State Building',
address: '350 5th Ave, New York, NY 10118'
}, {
name: 'Statue of liberty',
address: 'New York, NY 10004'
}, {
name: 'Rockefeller Center',
address: '45 Rockefeller Plaza, New York, NY 10111'
},
{
name: 'Brooklyn Bridge',
address: 'Brooklyn Bridge, New York, NY 10038'
},
{
name: 'Time Square',
address: '45 Rockefeller Plaza, New York, NY 10111'
},
{
name: 'World Trade Center',
address: '285 Fulton St, New York, NY 10007'
},
];
let locationsJSON = ko.toJS(self.location);
let locationsString = JSON.stringify(locationsJSON);