3

我通过从 ember 指南页面扩展示例博客应用程序来学习 ember 和 ember 数据,并且在实施用于添加新博客条目的“新”路线时遇到了一些困难。我正在使用 Parse 的 ember 数据适配器来保存数据。我已经成功连接到 Parse 并且可以查询和更新 Parse 中的记录。我创建了一个“新”路线并且可以创建一个新帖子,但我有两个问题:

1)我的新帖子路由在 Parse 上添加了帖子,但在保存后不会重定向回帖子路由。它给了我错误“未捕获的错误:断言失败:无法在未定义的对象上调用带有'id'的get。”。我尝试了 transitionTo('posts.post') 和其他选项的变体,但对于如何重定向回新帖子的帖子详细信息感到困惑。这是我的 PostsNewRoute:

App.PostsNewRoute = Ember.Route.extend({
    model: function() {
        return App.Post.createRecord();
    },
    events: {
        createPost: function() {
        this.get('store').commit();
        this.transitionTo('post');
        }
    }
});

2) 只要​​我输入新帖子的标题,它就会显示在帖子列表中,就像示例应用程序一样。但是,当我单击创建时,它会保留要解析的记录,然后也将解析记录添加到列表中。添加的第一个帖子的 ID 为空,第二个重复帖子的帖子 ID 来自 Parse。如果我单击第二个重复帖子,它会准确显示我想要的内容,即帖子详细信息视图中的新帖子。如何摆脱列表中的重复帖子,以及如何让重定向直接进入新帖子的详细信息?作为参考,我的路由器在下面

App.Router.map(function() {
    this.resource('posts', function() {
        this.resource('post', { path: ':post_id'});
        this.route('new')
    });
    this.resource('about');
});
4

1 回答 1

0

我认为,您想在从服务器返回后转换到post路由。commit我不确定是否commit返回承诺(我不在最新版本的 ED 上)

如果是,您可以使用 Promise 的then功能来转换成功。

this.get('store').commit().then(function(post) {
  this.transitionTo('posts.post', post);
});

如果不是,您可以将一个操作绑定到发布记录的 id,以便即使它发生变化,即从服务器返回,您也可以调用转换。假设post是对象。

post.addObserver('id', post, '_transitionFunction')

接着:

_transitionFunction: function() {
  var post = // some handle to the post object;
  post.removeObserver('id', this, '_transitionFunction');
  this.transitionTo('posts.post, post);
}

这些示例并不完全准确(我通常在控制器中执行此操作,而不是在路由中执行此操作,但如果您需要更多说明,请告诉我。

大家可以在这里看到一个实现

于 2013-07-22T23:36:59.670 回答