2013-07-07 22 views
3

這是一個jsfiddle演示:http://jsfiddle.net/YUHLA/5/Ember.js - 爲什麼this.get('model')返回一個控制器?

這是我試圖找出創建新記錄的正確模式時遇到的問題。我無法獲得新創建的記錄,我在路上遇到了一些奇怪的行爲。

打開控制檯,嘗試添加新帖子並保存。注意三點奇的出現:在控制器上

  1. 調用get(「模型」)上線62
  2. 返回控制線65上,它證明了沒有新的模型保存到燈具。
  3. 從帖子控制器創建另一個帖子並保存後,這兩個帖子都被保存(第70行)。

這裏的JavaScript:

window.App = Ember.Application.create(); 

App.Store = DS.Store.extend({ 
    adapter: DS.FixtureAdapter 
}); 

App.store = App.Store.create(); 

App.Post = DS.Model.extend({ 
    title: DS.attr('string'), 
    body: DS.attr('string') 
}); 

App.Post.FIXTURES = [ 
    { 
    id: 1, 
    title: 'title', 
    body: 'body' 
    }, { 
    id: 2, 
    title: 'title two', 
    body: 'body two' 
    } 
]; 

App.NewPostFormView = Ember.View.extend({ 
    tagName: "form", 
    templateName: "newPostForm", 
    submit: function() { 
    this.get('controller').save(); 
    return false; 
    } 
}); 

App.ApplicationController = Ember.ObjectController.extend({ 
    posts: (function() { 
    return App.Post.find(); 
    }).property() 
}); 

App.PostsController = Ember.ArrayController.extend({ 
    sortProperties: ['id'], 
    sortAscending: false, 
    itemController: 'post', 
    newPost: function() { 
    var post; 
    return post = App.Post.createRecord({ 
     title: '', 
     body: '', 
     isEditing: true 
    }); 
    } 
}); 

App.PostController = Ember.ObjectController.extend({ 
    save: function() { 
    var temp; 
    console.log('Starting to save'); 
    console.log('this.get(\'model\') =', this.get('model')); 
    transaction = App.store.transaction(); 
    this.set('isEditing', false); 
    temp = this.get('model'); 
    temp.get('store').commit(); 
     Ember.run.next(function(){ 
      console.log('# fixtures:', App.Post.FIXTURES.length); 
      App.Post.createRecord(
       {title: 'post four', body: 'four body'} 
     ).get('store').commit() 
      Ember.run.next(function(){ 
      console.log('# fixtures:', App.Post.FIXTURES.length); 
      }); 
     }); 
    } 
}); 

這是否與我是從崗位控制器創建模型,然後將其保存在控制器後的事實呢?如果是這樣,我該如何解決這個問題?

謝謝!

回答

2

這是否與我從帖子控制器創建模型然後將其保存在帖子控制器中這一事實?在控制器上

  1. 調用get( '模型')上線62

右鍵返回控制器。 PostsController已指定itemController: 'post',因此當帖子模板迭代{{each post in controller}}時,帖子將被封裝在PostController中。這很好,但不是與{{render}}幫手組合在一起。當在{{render post post}}的每個塊內使用{{render}}時,它將呈現帖子模板並將指定值(帖子變量)包裝在PostController中。所以你有兩個郵政控制器包裝單個郵政模型。有點矯枉過正。

  1. 在第65行,證明沒有新的模型被保存到燈具。

所以問題在於你有兩個不同的商店。 App.store()是在第14行創建的全局變量。因爲它是第一個創建的變量,所以它是default store。它與您的模型使用的不相關。

在PostController.save()中,this.get('model')正在返回一個控制器。而控制器的商店是默認商店。這通常與模特的商店相同,但在這種情況下不會。所以當你打電話給get('store').commit()那是在沒有模型的默認商店,所以沒有任何反應。如果你真的有一個模型(通過修復問題#1),這將是確定的。或者,如果您沒有創建App.store,它也可以,因爲在這種情況下,默認商店將與您的模型商店相同。

建議不要自己創建App.store(),這樣做只是令人困惑,可能不是您想要的。一般來說,最好讓燼創造東西。

  1. 創建從後控制器另一篇文章並保存後,這兩個職位被保存(行70)。

對。由於在App.store()上調用了commit(),App.Post的商店仍有一個未提交的記錄。 App.createRecord({})。get('store')。commit()在該存儲中創建第二條記錄,然後提交。

更新提琴在這裏:http://jsfiddle.net/YUHLA/7/

+1

感謝您的答覆。 'this.get('model')。save()'實際上並沒有向後端發出'POST'請求......這應該是這種情況嗎?我用一個事務創建了一個新的小提琴,它在小提琴上工作,但在我的應用程序中,同樣的過程未能發出後端的POST請求。 http://jsfiddle.net/YUHLA/9/ – tobobo

+1

啊,事實證明,我的問題與在父模型的後期模型中指定「embedded:always」有關。切換到「嵌入:加載」允許我單獨保存後期模型。現在我只需解決與POST請求中使用的密鑰相關的一些謎題,以及它們是否附加了_id。 – tobobo

+0

太棒了,很高興工作。 Re:使用的鍵,最適合看的地方是REST適配器的單元測試。只要看看爲每種類型的請求傳遞的ajax散列。 https://github.com/emberjs/data/blob/master/packages/ember-data/tests/unit/rest_adapter_test.js –

相關問題