Ember - Routes / Nesting / Params / HasMany

时间:2015-03-30 21:49:53

标签: ember.js ember-data

我还在学习Ember,我想帮助解决这个问题...

我有一个简单的图书馆应用程序,包含作者和书籍。 我想添加一个"添加书"链接到我的作者视图模板 我想要这个链接来呈现一个新的书籍模板,并定义了book.author。但我希望它显示在主要插座

我的模特:

App.Author = DS.Model.extend({
    name: DS.attr('string'),
    about: DS.attr('string'),
    picture: DS.attr('string'),
    books: DS.hasMany('book', {async: true})
});

App.Book = DS.Model.extend({
    title: DS.attr('string'),
    isbn: DS.attr('string'),
    summary: DS.attr('string'),
    isAvailable: DS.attr('boolean'),
    featured: DS.attr('boolean'),
    picture: DS.attr('string'),
    author: DS.belongsTo('author', {async: true})
});

以下是我的路线:

App.Router.map(function () {

    this.resource('books', function () {
        this.route('edit', {path: '/:book_id/edit'});
        this.route('view', {path: '/:book_id'});
    });

    this.resource('authors', function () {
        this.route('new');
        this.route('edit', {path: '/:author_id/edit'});
        this.route('view', {path: '/:author_id'}, function (){
            this.resource('books', function(){
                this.route('new');
            });
        });
    });
});

网址将与authors/4/books/new

类似

使用这种嵌套路线,我只能在books.new插座内显示我的authors模板。我无法在主插座上显示它。


我认为另一种方式是使用路线

App.Router.map(function () {

    this.resource('books', function () {
        this.route('new');
        this.route('edit', {path: '/:book_id/edit'});
        this.route('view', {path: '/:book_id'});
    });

    this.resource('authors', function () {
        this.route('new');
        this.route('edit', {path: '/:author_id/edit'});
        this.route('view', {path: '/:author_id'});
    });
});

并使用QueryParams

网址将与books/new?author_id=4

类似

模板显示正确,但我无法将我的新书记录绑定到其作者。

"什么是最佳实践"为了让它有用吗?你能给我一个有效的例子吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您的嵌套路线方法很好,然后在您的嵌套书籍/新控制器中添加:

needs: ['authors/view'],
author: Ember.computed.alias('controllers.authors.view.model')

然后假设您的图书/新控制器上有“保存”操作:

save: function() {
  var model = this.get('model');
  var author = this.get('author');
  model.set('author', author);
  model.save().then(...);
}