Ember.js通过选择菜单设置属于关系

时间:2014-03-29 15:32:58

标签: ember.js ember-data

假设我有两个模型ChapterBook(使用ember-data)。

App.Book = DS.Model.extend
  name: DS.attr 'string'
  chapters: DS.hasMany 'chapter'

App.Chapter = DS.Model.extend
  name: DS.attr 'string'
  book: DS.belongsTo 'book'

我有一个用于编辑Chapter的界面,其中我想提供一个用于指定父Book的选择菜单。

App.Router.map ->
  @resoure 'chapters', ->
    @route 'edit', path: ':chapter_id/edit'


App.ChaptersEditRoute = Ember.Route.extend
  model: (params) ->
    @store.find('chapter', params.chapter_id)

  setupController: (controller, model) ->
    controller.set('content', model)
    controller.set('books', @store.find('book'))

我抓取Book中的所有ChaptersEditRoute,以便我可以Ember.Select查看contentBinding

... form stuff

{{view Ember.Select contentBinding="books"
                    optionValuePath="content"
                    optionLabelPath="content.name"
                    prompt="Select a Book"
                    selectionBinding="book"}}

<button {{action "submit"}}>Save</button>

ChaptersEditController我有submit动作处理程序。

App.ChapterEditController = Ember.ObjectController.extend
  actions:
    submit: ->
      chapter = @get('model')
      book = chapter.get('book')
      chapter.set('book', book)
      chapter.save().then(@onCreate.bind(@), @onFail.bind(@))

  onCreate: ->
    ... implementation

  onFail: ->
    ... implementation

虽然这确实有效,但我对 的运作方式持怀疑态度。

  1. 选择菜单中的选项值为Book个对象。
  2. 我是根据选项值(Book对象)直接设置关联。
  3. 这是通过选择菜单设置belongsTo关联的有效解决方案吗?

    第二个选项是将Book ID作为选项值传递,方法是将optionValuePath更改为content.id而不是content,并添加value选项。

    {{view Ember.Select contentBinding="books"
                        optionValuePath="content.id"
                        optionLabelPath="content.name"
                        value=book_id
                        prompt="Select a Book"
                        selectionBinding="book"}}
    

    并更新控制器中的submit操作处理程序。

    ...
    
    submit: ->
      chapter = @get('model')
      @store.find('book', chapter.get('book_id')).then (book) =>
        chapter.set('book', book)
        chapter.save().then(@onCreate.bind(@), @onFail.bind(@))
    

    此解决方案存在一些问题。

    1. 如果用户未更改选择菜单,则永远不会设置book_id并且submit操作处理程序会中断。
    2. 我们向商店询问我们已经加载的对象,这可能会也可能不会增加一些冗余。
    3. 最终,我不确定通过选择菜单设置belongsTo关联的“Ember方式”是什么。

      赞赏任何意见。

0 个答案:

没有答案