Ember.js-为什么this.get('model')会返回一个控制器?

时间:2013-07-07 00:15:28

标签: javascript ember.js ember-data

这是一个jsfiddle演示:http://jsfiddle.net/YUHLA/5/

这是我在尝试找出创建新记录的正确模式时遇到的问题。我无法获得新创建的记录,我在途中遇到了一些奇怪的行为。

打开控制台,尝试添加新帖并保存。注意三个奇数:

  1. 在控制器上调用get('model')将返回第62行的控制器。
  2. 在第65行,证明没有新模型保存到灯具中。
  3. 从帖子控制器创建另一个帖子并保存后,两个帖子都被保存(第70行)。
  4. 这是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);
              });
          });
      }
    });
    

    这是否与我从posts控制器创建模型,然后将其保存在post控制器中的事实有关?如果是这样,我该如何解决这个问题?

    谢谢!

1 个答案:

答案 0 :(得分:2)

  

这是否与我从posts控制器创建模型,然后将其保存在post控制器中的事实有关?

没有

  
      
  1. 在控制器上调用get('model')将返回第62行的控制器。
  2.   

右。 PostsController已指定itemController: 'post',因此当帖子模板重复{{each post in controller}}时,帖子将被包含在PostController中。这很好但不与{{render}}助手结合使用。当{{render}}在每个块中使用{{render post post}}时,它会呈现帖子模板并将指定的值(post变量)包装在PostController中。所以你有两个邮政控制器包装一个帖子模型。有点矫枉过正。

  
      
  1. 在第65行,证明没有新模型保存到灯具中。
  2.   

这里的问题是你有两个不同的商店。 App.store()是在第14行创建的全局变量。由于它是第一个创建的变量,因此它是default store。它与您的模型使用的无关。

在PostController.save()中,this.get('model')正在返回一个控制器。控制器的商店是默认商店。这通常与模型的商店相同,但在这种情况下不同。因此,当您调用默认商店中没有模型的get('store').commit()时,没有任何反应。如果你真的有一个模型(通过修复问题#1),那就没关系了。或者,如果您没有创建App.store,那也可以,因为在这种情况下,默认商店将与您的模型商店相同。

建议不要自己创建App.store(),这样做只是令人困惑,可能不是你想要的。一般来说,最好让ember创造东西。

  
      
  1. 从帖子控制器创建另一个帖子并保存后,两个帖子都被保存(第70行)。
  2.   

右。因为在App.store()上调用了commit(),App.Post的商店仍然有一个未提交的记录。 App.createRecord({})。get('store')。commit()在该商店中创建第二条记录,然后同时提交。

此处更新了小提琴:http://jsfiddle.net/YUHLA/7/