【问题标题】:Ember - Only update fields returned in response JSONEmber - 仅更新响应 JSON 中返回的字段
【发布时间】:2014-11-17 16:26:14
【问题描述】:

我们想为我们的 ember 项目添加延迟加载功能,但看起来 ember 总是会用 NULL 覆盖响应 JSON 未返回的字段。首先我得到一个用户列表:

获取https://example.com/users

{
  "users": [
    {
      "id":        1,
      "name":      'user1',
      "email":     'email@user1.com',
      "images":    [],
      "posts":     []
    },
    {
      "id":        2,
      "name":      'user2',
      "email":     'email@user2.com',
      "images":    [],
      "posts":     []
    },
    {
      "id":        3,
      "name":      'user3',
      "email":     'email@user3.com',
      "images":    [],
      "posts":     []
    },
  ]
}

这提供了一组最小的用户信息,有两个空的 hasMany 关系“图像”和“帖子”。

现在,如果有人想查看用户的帖子或图片,他会点击触发延迟加载的按钮:

获取https://example.com/userImages/1

{  
  "user": {
    "id":      1,
    "images": [1,2,3,4]
  },
  "images": [
    {
      "id":     1,
      "name":   "image1",
      "path"    "path/to/img1/" 
    },
    {
      "id":     2,
      "name":   "image2",
      "path"    "path/to/img2/" 
    },
    {
      "id":     3,
      "name":   "image3",
      "path"    "path/to/img3/" 
    },
    {
      "id":     4,
      "name":   "image4",
      "path"    "path/to/img4/" 
    }            
  ]
}

为了将流量减少到最低限度,仅包含新加载的信息。在适配器反序列化并将新数据推送到存储后,来自 User1 的所有未包含在有效负载(名称、电子邮件)中的字段在 ember 存储中设置为 NULL(使用 store.pushPayload('model ',有效载荷))。

是否有可能只更新传入的数据?或者是否有处理这种情况的通用最佳实践?

提前感谢您的帮助

编辑: 一种可能性是使用块扩展 ember-data "_load()" 函数

for (var key in record._data) {
    var property = record._data[key];
    if( typeof(data[key]) == 'object' && data[key] == null ) {
       data[key] = property;
    }
 }

但这是我能想象到的最糟糕的解决方案。

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    我想你想要的是store's update method。就像push(或pushPayload),只是它只更新你给它的数据。

    【讨论】:

    • 看起来很有希望,但据我所知,更新仅更新单个模型并且无法存储侧载模型
    • 该功能只会更新,是的。但是编写一个快速函数来拆分数据并为您调用pushupdate 方法并不难。
    【解决方案2】:

    您的属性返回一个承诺,该承诺返回从服务器返回的任何内容。

    foobar: function() {
        return this.store.find('foobar');
    }
    

    当 Promise 解决时,您有两个版本的数据,一个已经在客户端渲染(dataOld),一个刚刚从后端返回(dataNew)。要更新客户端而不删除未更改的内容,您必须合并旧的和新的。大致如下:

    foobar: function() {
        var dataOld = this.get('foobar');
    
        return this.store.find('foobar').then(function(dataNew) {
          return Ember.$.merge(dataOld, dataNew);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2014-08-29
      • 1970-01-01
      相关资源
      最近更新 更多