SORU
9 Mayıs 2013, PERŞEMBE


Nasıl EmberJS / Ember Veri tek bir rota ile birden fazla modeli kullanmak için?

Belgeleri okuma, (veya) o yüzden böyle bir yol için bir model atamak zorunda gibi görünüyor

App.PostRoute = Ember.Route.extend({
    model: function() {
        return App.Post.find();
    }
});

Eğer belirli bir rota içinde çeşitli nesneleri kullanmak için ihtiyacım olursa? yani Mesajlar, Yorumlar ve Kullanıcılar? Nasıl bir yol bu yükü söyle?

CEVAP
9 Mayıs 2013, PERŞEMBE


Güncelleme:Benim orijinal cevap model tanımı embedded: true kullanma dedim. Bu doğru değil. Revizyon 12, Ember-Veri yabancı anahtarlar bir sonek (link) tek bir kayıt için _id _ids ile tanımlanan koleksiyon için bekliyor. Aşağıdakine benzer bir şey:

{
    id: 1,
    title: 'string',
    body: 'string string string string...',
    author_id: 1,
    comment_ids: [1, 2, 3, 6],
    tag_ids: [3,4]
}

Keman güncelledik ve eğer bir değişiklik olursa ya da eğer kodu bu cevap sağlanan daha fazla sorunlarla bulursam aynı şeyi yapmayacağım.


İlgili modelleri ile cevap

Anlattığın senaryo için modelleri arasında associations güvenmek istiyorum(embedded: true ayar)ve sadece yük Post model rota, dikkate edebilirim tanımlamak bir DS.hasMany Derneği Comment model DS.belongsTo Derneği User hem Comment Post modelleri. Şöyle bir şey:

App.User = DS.Model.extend({
    firstName: DS.attr('string'),
    lastName: DS.attr('string'),
    email: DS.attr('string'),
    posts: DS.hasMany('App.Post'),
    comments: DS.hasMany('App.Comment')
});

App.Post = DS.Model.extend({
    title: DS.attr('string'),
    body: DS.attr('string'),
    author: DS.belongsTo('App.User'),
    comments: DS.hasMany('App.Comment')
});

App.Comment = DS.Model.extend({
    body: DS.attr('string'),
    post: DS.belongsTo('App.Post'),
    author: DS.belongsTo('App.User')
});

Bu tanım aşağıdaki gibi bir şey üretir:

Associations between models

Bu tanım, ne zaman olursa find bir Yazı, ben erişimi koleksiyonu yorumları ile ilgili bu yazı ve yorum yazarı olarak, ve kullanıcı hangi yazarın sonrası,gömülü oldukları. Rota basit kalır:

App.PostsPostRoute = Em.Route.extend({
    model: function(params) {
        return App.Post.find(params.post_id);
    }
});

Yani içinde PostRoute (ya da PostsPostRoute kullanıyorsanız resource), benim şablonları erişimi denetleyicisi content olan Post model, yani bakın yazar, Basit olarak author

<script type="text/x-handlebars" data-template-name="posts/post">
    <h3>{{title}}</h3>
    <div>by {{author.fullName}}</div><hr />
    <div>
        {{body}}
    </div>
    {{partial comments}}
</script>

<script type="text/x-handlebars" data-template-name="_comments">
    <h5>Comments</h5>
    {{#each content.comments}}
    <hr />
    <span>
        {{this.body}}<br />
        <small>by {{this.author.fullName}}</small>
    </span>
    {{/each}}
</script>

(fiddle)


Non-ilgili modeller: ile cevap

Eğer senaryo senin tarif ettiğin şey biraz daha karmaşık ise ve/veyavar(veya sorgu) belirli bir güzergah için farklı modeller kullanmak, Route#setupController bunu yapmak için tavsiye ederim. Örneğin:

App.PostsPostRoute = Em.Route.extend({
    model: function(params) {
        return App.Post.find(params.post_id);
    },
    // in this sample, "model" is an instance of "Post"
    // coming from the model hook above
    setupController: function(controller, model) {
        controller.set('content', model);
        // the "user_id" parameter can come from a global variable for example
        // or you can implement in another way. This is generally where you
        // setup your controller properties and models, or even other models
        // that can be used in your route's template
        controller.set('user', App.User.find(window.user_id));
    }
});

Ve şimdi Post rota olduğum zaman, benim şablonları setupController kanca, set up, kontrol sistemi user özellik erişimi olacak:

<script type="text/x-handlebars" data-template-name="posts/post">
    <h3>{{title}}</h3>
    <div>by {{controller.user.fullName}}</div><hr />
    <div>
        {{body}}
    </div>
    {{partial comments}}
</script>

<script type="text/x-handlebars" data-template-name="_comments">
    <h5>Comments</h5>
    {{#each content.comments}}
    <hr />
    <span>
        {{this.body}}<br />
        <small>by {{this.author.fullName}}</small>
    </span>
    {{/each}}
</script>

(fiddle)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Julian Smith

    Julian Smith

    31 EKİM 2006
  • MaximumPCMag

    MaximumPCMag

    23 Temmuz 2010
  • SRI International

    SRI Internat

    30 NİSAN 2008