2014-10-01 35 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