假设我有两个模型Chapter
和Book
(使用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
虽然这确实有效,但我对 的运作方式持怀疑态度。
Book
个对象。Book
对象)直接设置关联。 这是通过选择菜单设置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(@))
此解决方案存在一些问题。
book_id
并且submit
操作处理程序会中断。 最终,我不确定通过选择菜单设置belongsTo
关联的“Ember方式”是什么。
赞赏任何意见。