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

Ember.js—Why would this.get('model') return a controller?

本文关键字:返回 一个 控制器 js 为什么 this Ember model get      更新时间:2023-09-26

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

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

打开控制台,然后尝试添加新帖子并保存。请注意三个奇怪的情况:

  1. 在控制器上调用 get('model'( 将返回第 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);
          });
      });
  }
});

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

谢谢!

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

不。

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

右。 PostsController指定了itemController: 'post',因此当帖子模板迭代{{each post in controller}}帖子时,帖子将被包装在PostController中。这很好,但不能与{{render}}助手结合使用。当{{render}}在每个块中使用{{render post post}}时,它会渲染帖子模板并将指定的值(post变量(包装在PostController中。因此,您有两个后置控制器包装一个后置模型。有点矫枉过正。

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

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

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

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

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

右。因为 commit(( 是在 App.store(( 上调用的,所以 App.Post 的存储仍然有一个未提交的记录。App.createRecord({}(.get('store'(.commit(( 在该存储中创建第二条记录,然后提交两条记录。

在这里更新小提琴:http://jsfiddle.net/YUHLA/7/