4

我一直在谷歌搜索和搜索 Stack Overflow 以获取有关此主题的某种提示,但信息充其量是分散的。

我正在尝试创建一个新的子记录 ( Comment) 并将其保存到现有的父记录 ( Post)。我使用的是 Ember-Model,而不是 Ember-Data,但任何提示或指示将不胜感激。

目前,我已经成功地创建了一个新的嵌入式,Comment只有当它是用 Post记录创建时。所以:

如何加载/检索当前加载的Post(父记录)以应用Comments(子记录)?

我一直在阅读控制器依赖关系,使用needs:andthis.controllerForthis.modelFor访问另一个控制器/模型content,但无法将这些东西连接在一起成为有意义的东西。

无论如何,这就是我将我的应用程序代码缩减到的内容,希望我能够偶然发现这样做的正确方法......

路线

    App.Router.map(function() {
      this.resource('post', { path: '/:post_id' }, function() {
        this.resource('comments', { path: '/comments'} );
        });
    });

我删除了所有其他资源和路线,所以剩下App.Post,App.PostIndexApp.Comments. 我认为我的路线是这里的问题,我假设我没有正确实施在我的路线中使用加载Post记录的方法。Comments

    App.IndexRoute = Ember.Route.extend({
      model: function() {
        return App.Post.find();
      },

      setupController: function(controller, model) {  // I'm not certain if this
        controller.set('content', model);           // setupController is needed?
      }

    });

    App.PostRoute = Ember.Route.extend({
      model: function(params) {
        return App.Post.find(params.post_id);
      },

      setupcontroller: function( controller, model) { // again, unsure if this
          this.controllerFor('post').get('comments'); // is correct.
            controller.set('content', comments);
      }

    });

    App.CommentsRoute = Ember.Route.extend({
      afterModel: function() {
          this.set('post', this.modelFor('post'));
        },

      setupcontroller: function( controller, model) {
          this.controllerFor('post').get('comments');
            controller.set('content', comments);
        }

    });

控制器

App.CommentsController = Ember.ArrayController.extend({
  needs: "post",

  actions: {

     addComment: function() {
          var post = App.Post.create({
            title: 'static post title'
          });

              post.get('comments').create({
                message: 'static message'
            });

              post.save();

      }

  }

});

这是我当前的评论控制器,它可以创建一个新Post的带有嵌入式Comment. 我已经找到并获得了许多创建 的示例Comment,但似乎没有一个对我有用。基本上,我正在努力将其定义var post = ...为当前加载的记录。我已经实施了各种方法来尝试试错。到目前为止,我已经尝试过:

  • var post = App.Post.create();,返回属性未定义,因为这将创建一个新记录。但是,我试了一下,因为我看到的每个与此相关的示例都定义了他们的记录。

  • var post = this.get('post');,在未定义时返回一个不能调用'get'。我已经尝试使用这种方法在Comments控制器和Post控制器上定义我当前的帖子。

  • var post = this.get('controllers.post.content);,从我正在使用的后端返回一个“循环错误”。

  • var post = App.Post.find();,在未定义时返回一个不能调用'get'。

  • var post = App.Post.find(1);, 同样,返回一个不能在 undefined 上调用 'get'。我想我会试一试,因为这是人们提供的那些反复出现的例子之一。我使用的后端将自己的 ID 应用于每条记录,我不确定我是否能够/如何让该.find()方法使用动态 ID 值并仅检索我刚刚加载的模型。

我猜我没有正确设置我的路由和控制器依赖项?

如果有人有建议、相关链接或修复,我将不胜感激。

在这一点上,这个(看似简单的)问题/用例让我束手无策。

4

1 回答 1

1

试试这个(在 beta 2 之前工作):

App.CommentsController = Ember.ArrayController.extend({
  actions: {
     addComment: function() {
        this.content.createRecord({
            message: 'static message'
        });   
     }
  }
});

Ember Data Beta 2 及更高版本:

App.CommentsController = Ember.ArrayController.extend({
  needs: ["post"],
  actions: {
     addComment: function() {
        var post = this.get('controllers.post');
        var comment = this.get('store').createRecord('comment', {
            message: 'static message',
            post: post
        }); 
        comment.save().then(function() {
            post.addObject(comment);
            // You may or may not need to save your post, too. In my case my backend handles 
            // the inverses of relationships (if existing), so there's no need. We still need 
            // to do this for Ember, though

        });      
     }
  }
});
于 2013-09-20T18:34:10.677 回答