【问题标题】:ember.js update view after PUT using node.js/express使用 node.js/express PUT 后 ember.js 更新视图
【发布时间】:2014-11-26 07:25:46
【问题描述】:

我对 ember 很陌生。我有一个带有 CRUD 页面的基本 ember 应用程序。在使用 mongoDB 向节点 API 发出 PUT 请求后,我无法刷新 CRUD 页面的视图/模板。

当我删除模型时,页面刷新正常,但在我 PUT 时却没有。如果我刷新页面,一切都很好并且可以正常工作,但是我希望在单击“批准”按钮后立即刷新视图。

有人能指出我应该如何在 Ember 中处理这个问题的正确方向吗?还是我没有从我的 API 正确返回某些东西,而 Ember 正在做它应该做的事情?

谢谢

节点 API PUT:

router.put( '/:id', function( req, res ) {
  return Picture.findById( req.params.id, function( err, picture ) {

    picture.status = req.body.picture.status;
    picture.url = req.body.picture.url;
    //...and so on

    return picture.save( function( err ) {
        if( !err ) { return res.send( picture ); }
        return res.send('ERROR');
    });
  });
});

型号:

App.Picture = DS.Model.extend
  authorName: DS.attr('string')
  pictureName: DS.attr('string')
  url: DS.attr('string')
  tags: DS.attr('string')
  status: DS.attr('string')

路线:

App.AdminRoute = Ember.Route.extend

      model: ->
        return @store.find 'picture'

      actions:

        delete: (picture) ->
          picture.destroyRecord() # view updates fine

        approve: (picture) ->
            picture.set('status', 'verified')
            picture.save()

注意 - 我的控制台中也出现了这个我不了解的错误 - 我不记得总是收到它,所以我不确定它有多少相关性。

Error: No model was found for 'v'
    at new Error (native)
    at Error.r (http://localhost:3000/javascripts/libs/ember-1.7.0.js:4:992)
    at Ember.Object.extend.modelFor (http://localhost:3000/javascripts/libs/ember-data.js:3:4754)
    at t.default.i.extend.extractSingle (http://localhost:3000/javascripts/libs/ember-data.js:1:23642)
    at y (http://localhost:3000/javascripts/libs/ember-1.7.0.js:4:30411)
    at r [as extractSingle] (http://localhost:3000/javascripts/libs/ember-1.7.0.js:4:28863)
    at e.default.Ember.Object.extend.extractSave (http://localhost:3000/javascripts/libs/ember-data.js:1:22390)
    at e.default.Ember.Object.extend.extractUpdateRecord (http://localhost:3000/javascripts/libs/ember-data.js:1:22097)
    at e.default.Ember.Object.extend.extract (http://localhost:3000/javascripts/libs/ember-data.js:1:21661)
    at http://localhost:3000/javascripts/libs/ember-data.js:3:9807 

【问题讨论】:

  • PUT 的响应的有效负载是什么样的?
  • 使用 Chrome 调试器并查看网络部分。单击有问题的请求,然后单击“响应”选项卡。您应该会看到 Ember 尝试解析的 JSON 响应。我的猜测是它包含一个以v 开头的元素(可能是根):)
  • 太棒了,感谢史蒂夫的解释!不过,看起来返回的 JSON 还是不错的。我更改的属性是“状态”从未验证到验证:{“_id”:“5428abf33e733af2fc0007ff”,“作者姓名”:“本”,“图片名称”:“骄傲的鸡”,“状态”:“验证”,“标签” :null,"url":"benrlodge.github.io/isotopeSearchFilter/img/four.jpg"}

标签: node.js mongodb ember.js express coffeescript


【解决方案1】:

从服务器返回的 JSON 负载的格式不适合 Ember 确定模型类型。 Ember 期待这样的事情:

{
    picture: {
        "_id":"5428abf33e733af2fc0007ff","authorName":"Ben","pictureName":"Proud Chicken",
        "status":"verified","tags":null,"url":"benrlodge.github.io/isotopeSearchFilter/img/four.jpg"
    }
}

既然您说它在刷新时有效,请尝试将此有效负载与从GET 返回的内容进行比较。 PUT 响应应该类似。

请参阅此 Ember 指南:http://emberjs.com/guides/models/connecting-to-an-http-server/#toc_json-conventions

要调整有效负载并(例如)删除有问题的属性,您可以这样做:

App.PictureSerializer = DS.RESTSerializer.extend({
    normalizePayload: function(payload) {
        if (payload['__v']) {
            delete payload['__v'];
        }
        return this._super(payload);
    }
});

此示例适用于PictureSerializer,但如果您将其设为ApplicationSerializer,它将适用于任何类型。在此处查看 API:http://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_normalize

【讨论】:

  • 好的,感谢您指出 - 我调整了我的 PUT 响应以在 Ember 约定中返回。它仍然没有更新......我现在也看到你提到的“v”,不知道为什么它现在才出现(即使我改回只是 res.send(picture) 它显示了 v)。无论如何,这就是我返回响应但没有运气的方式:{ "picture": { "__v":0,"_id":"542af500bc85c675bbbd49c0", "authorName":"ben", "pictureName":"Dog Hair", "status":"verified", "tags":"dog, dog hair", "url":"http://benrlodge.github.io/isotopeSearchFilter/img/seven.jpg" } }
  • 我刚刚注意到“没有找到'v'的模型”只出现在我的一些记录中。我刚刚尝试更新另一条记录,它说“没有找到'id'的模型”。也许这与 MongoDB 在 id 前面加上下划线有关?我确实将 primaryKey: "_id" 添加到 ApplicationSerializer 以解决我之前遇到的问题。 FWIW 我了解到“__v”与猫鼬有关(mongoosejs.com/docs/guide.html#versionKey),仍然不知道这是否导致我的问题在这里想到但我想我会提到。
  • 我遇到了同样的问题,我尝试使用你的 normalizePayload 函数,但我得到“哈希未定义”。知道为什么吗?
  • 抱歉,应该是payload,而不是hash。我已经更正了我的答案。
猜你喜欢
  • 1970-01-01
  • 2014-01-14
  • 2012-04-13
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
相关资源
最近更新 更多