0

いくつかの「野心的な」Web アプリを構築するために、ember のルートとモデルを使用したいと考えています。これが私がやろうとしていることです。私は本と著者のモデルを持っています。著者リソースのリストを表示しているときに、ユーザーが著者をクリックすると、ネストされたルートを介してその著者のすべての本が表示されます。そこで、著者 ID (または名前) をブック モデルに渡す動的セグメントとして扱いたいと思います。ただし、動的セグメントは現在のモデルのものでなければならず、primaryKey他のモデル属性またはモデルを使用できないという制限があるようです。

カスタム デシリアライザーを作成する必要がありますか? もしそうなら、このシナリオに適用可能なフィドルの例は大歓迎です。

これは、コメントに特定の質問が表示されている、私がやろうとしていることを説明するコードの例です。

Authors.hbs テンプレート

        <div class="span3">
            <h4>Books</h4>
            <ul class="unstyled">
                {{#each model}}
                    {{#linkTo 'authors.books' this}}<li>
                        {{name}} <small>{{date dob}}</small> <small> {{origin}}</small>
                    </li>{{/linkTo}}
                {{/each}}
            </ul>
        </div>
        <div class="span8">
            {{outlet}}
        </div>

初期化.コーヒー

@resource 'books', ->
  @resource 'book', {path: ':cube_id'}
@resource 'authors', ->
  @resource 'AUTHOR', {path: ':AUTHOR_id'}
  # QUESTION How to make the next line retrieve books-by-author from the book model?
  @route 'books', {path: '/books/:author_id'}

著者ルート

module.exports = App.AuthorsRoute = Em.Route.extend
    model: ->
        App.Author.find()

ブックルート

module.exports = App.BooksRoute = Em.Route.extend
    model: ->
        App.Book.find()
    # QUESTION How should the model be extended to allow for lookup by attribute?
    # model: (params) ->
    # App.Book.find { author: params.book_id }

著者モデル

module.exports = App.Author = DS.Model.extend
    name: DS.attr 'string'
    origin: DS.attr 'string'
    dob: DS.attr 'date'

ブックモデル

module.exports = App.Book = DS.Model.extend
    name: DS.attr 'string'
    author: DS.attr # QUESTION How to wire together models here?
    #author: DS.belongsTo 'App.Author'
    publisher: DS.attr 'string'
    published: DS.attr 'date'
4

1 に答える 1

0

少し前に、似たような質問に答えました (ガイドにも記載されています) belongsTo(モデル レコードが別のモデルに属している場合)、またはhasMany(モデル レコードに別のモデルのレコードが多数関連付けられている場合)などの関連付けでモデルをリンクする方法それへ)および同じルートで複数のモデルを使用する方法。

Ember-Data によって提供される関連付けを使用して、(a) 関連するレコードのコレクション、または (b) 問題のレコードの親である単一のレコードであるモデル内のプロパティを作成できます。次に、ビュー レイヤーで、これらのプロパティ (コレクションまたはその他) を名前で参照するだけです (以下の提案されたテンプレートを参照してください)。

特定のアプリに関しては、以下に提案されているようにモデルを作成できます。

module.exports = App.Author = DS.Model.extend
    name: DS.attr 'string'
    origin: DS.attr 'string'
    dob: DS.attr 'date'
    books: DS.hasMany 'App.Book'

module.exports = App.Book = DS.Model.extend
    name: DS.attr 'string'
    author: DS.belongsTo 'App.Author'
    publisher: DS.attr 'string'
    published: DS.attr 'date'

両方のモデルがお互いを認識していることに注意してください。このモデル宣言により、以下の表現に似たデータ構造が得られます。したがって、 のインスタンスがあるたびにBook、そのプロパティを使用して、モデルでauthor定義されたプロパティ ( など) にアクセスできます。Authordobname

     _____________________ ______________________
    | | 著者 | | | 本 |        
    |---------------------| |----------------------|
(PK)| + id: int |◄-\ |--►►| + id: int |(PK)
    | | + 名前: 文字列 | \ | | | + 名前: 文字列 |
    | | + 原点: 文字列 | \--d----| + 作成者: App.Author |(FK)
    | | + 生年月日: 日付 | / | + 出版社: 文字列 |
(FK)| + 本: App.Book[] |-----/ | + 公開: 日付 |
    |_____________________| |______________________|

ビューレイヤーで参照できる関連付けに依存してAuthor.books(コントローラーまたはモデルのプロパティであるコレクションを反復するときはcontent.books、ビューで使用します)、その著者による本のコレクションを取得し、{{#each}}ブロックで使用します. 例として、このフィドル、特に特定のタグに関連付けられた投稿のリストを反復処理しているテンプレートタグ/タグを見てください。サンプルは「ブログ」用ですが、現在使用しているエンティティ タイプに同じ概念を使用できます。

したがって、あなたの場合、「authors.author」ルートであっても、テンプレートは次のようになります。

<h3>Books written by <em>{{name}}</em></h3>
<ul>
    {{#each content.books}}
        <li>
           {{#linkTo books.book this}}
               <i class="icon-book"></i> 
               <!-- consider a helper to display the year or format the date
                    instead of "publisehd" which will display an ugly date -->
               {{this.name}} (this.published) 
           {{/linkTo}}
        </li> 
    {{else}}
    <li>
        <div class="alert">
            <a class="close" data-dismiss="alert" href="#">&times;</a> 
            This author hasn't written any books that we know of.. seriously...
        </div>
    </li>
    {{/each}}
</ul>

{{#each}}ヘルパーはコレクション、つまりBook、モデル宣言の関連付けを通じて利用できるモデルのインスタンスを繰り返し処理していることに注意してください。

于 2013-07-30T21:02:08.983 に答える