我通过ko.mapping.fromJS(data,{},this)获取json数据将列表映射到observablearray;
当页面加载时,数组中的第一项通过以下代码设置为选中。当用户点击缩略图时,我将通过ajax抓取该图像/照片并将其放入图像observableArray中。这里的目标是在本地存储每个用户点击它时选择的照片,当他们再次点击该图像时,它首先检查observablearray以查看是否已经加载
ko.mapping.fromJS(data, {}, this);
//set self.selected value to the first item in the array
self.selected = ko.observable(self.photos()[0]);
//initializing in page observableArray
self.images = ko.observableArray([]);
//putting already loaded first item into images
self.images.push(self.photos()[0]);
当用户点击缩略图时,我执行以下操作以查看图像是否在可观察数组中。如果没有找到,则执行ajax从服务器获取,否则只需将所选照片设置为新的self.selected
//in array
var found = ko.utils.arrayFilter(self.images(), function (item) {
return item.photoId() == id;
});
if (found.length === 0) {
var q = ko.mapping.toJSON({ id: id });
GetData(url + '/GetPhotoClient', q,
function (data) {
if (data.success === true) {
ko.mapping.fromJS(data.photoClient, {}, self.selected);
self.selected(data.photoClient);
//put recent photo into images
self.images.push(ph);
} else {
alert(data.success);
}
}
, true);
} else {
self.selected(ko.observable(found));
}
在我用来显示图片的页面中。
有时我会使用selected()。imageSource和其他时间选择.imageSource。
似乎找到的值是一个对象而不是可观察对象。我相信我错过了一些基本概念。即为什么在某些时候我使用selected()。imageSource,有时候它是selected.imageSource,为什么object的值等于一个对象而不是一个可观察的对象。
我希望这很清楚。
答案 0 :(得分:0)
发生这种情况是因为当您从服务器获取客户端照片时,您没有为该对象self.selected(data.photoClient);
创建可观察对象,而当您已有照片时,您为找到的对象创建了一个可观察对象{{1} }。
顺便说一下,你可能应该看看ko.utils.unwrapObservable(obj),它抽象出了可观察的概念,并且总是返回对象的值。