可观察对象vs ObservableArray和arrayFilter

时间:2015-12-12 16:46:41

标签: knockout.js knockout-mapping-plugin observable

我通过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的值等于一个对象而不是一个可观察的对象。

我希望这很清楚。

1 个答案:

答案 0 :(得分:0)

发生这种情况是因为当您从服务器获取客户端照片时,您没有为该对象self.selected(data.photoClient);创建可观察对象,而当您已有照片时,您为找到的对象创建了一个可观察对象{{1} }。

顺便说一下,你可能应该看看ko.utils.unwrapObservable(obj),它抽象出了可观察的概念,并且总是返回对象的值。