2014-10-01 33 views
0

我很新的烬。我有一个基本的烬应用程序与CRUD页面。在使用mongoDB向节点API发出PUT请求后,我无法刷新CRUD页面的视图/模板。ember.js使用node.js更新视图PUT使用node.js/express

当我删除一个模型,页面刷新罚款,但不是当我放。如果我刷新页面,一切都很好,并且工作正常,但是只要点击我的“批准”按钮,我就会立即刷新视图。

有人能指出我该如何在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 
+0

对'PUT'的响应有效负载是什么样的? – 2014-10-01 23:11:50

+0

使用Chrome调试器并查看网络部分。点击有问题的请求,然后点击“回复”标签。你应该看到Ember试图解析的JSON响应。我的猜测是它包含一个以“v”开头的元素(也许是根):) – 2014-10-02 22:06:49

+0

太棒了,谢谢你解释史蒂夫!当然,虽然看起来返回的JSON是好的。我更改的属性是“状态”从未验证到验证: {“_id”:“5428abf33e733af2fc0007ff”,“authorName”:“Ben”,“pictureName”:“骄傲的鸡”,“状态”:“已验证” “:null,”url“:”http://benrlodge.github.io/isotopeSearchFilter/img/four.jpg“} – Ben 2014-10-02 23:55:24

回答

0

从服务器返回的JSON有效负载未采用适合Ember的格式来确定模型类型。灰烬期待这样的事情:

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

既然你说,当你刷新它的工作原理,尝试比较该有效载荷与取之于GET返回。 PUT响应应该类似。

请参阅本灰烬指南: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

+0

对,谢谢指出 - 我调整了我的PUT响应,以Ember约定返回。它仍然不更新,虽然...我现在也看到你提到的“v”,不知道为什么它现在只显示出来(即使当我改回res.send(图片)它显示v)。不管怎么说,这里是我怎么也响应返回,但没有运气: '{ “图片报”: { “__v”:0, “_ ID”: “542af500bc85c675bbbd49c0”, “AUTHORNAME”: “奔”, “pictureName “:”狗毛“, ”status“:”verified“, ”tags“:”dog,dog hair“, ”url“:”http://benrlodge.github.io/isotopeSearchFilter/img/seven。 jpg“ } } ' – Ben 2014-10-03 02:43:44

+0

我刚刚注意到”没有找到'v'的模型“只出现在我的一些记录中。我只是尝试更新另一条记录,并说“没有找到'id'的模型”。也许这与MongoDB预先使用id和下划线有关?我没有将primaryKey:“_id”添加到ApplicationSerializer中,以解决我之前遇到的问题。 FWIW我学会了“__v”与猫鼬有关(http://mongoosejs.com/docs/guide.html#versionKey),但仍不知道这是否导致我在这里想到的问题,但我想提一提。 – Ben 2014-10-03 02:48:07

+0

我遇到了同样的问题,我尝试使用normalizePayload函数,但是我得到了“未定义哈希”。任何想法为什么? – AllTheTime 2014-10-14 16:55:08