2013-05-20 68 views
5

在一個「頁面」上顯示兩種不同類型的兩種不同型號實例的基本設置是什麼?如何在一個EmberJS頁面上顯示兩個模型?

例如,我有兩種模式,比如學院和學生。每個都存儲在REST服務器中。在特定的路線上,我想拉取每個特定的實例並顯示每個實例的「name」屬性。

來自Rails世界,我不太瞭解EmberJS的Model-View-Controller概念。看來在EmberJS中,每個控制器只能處理一種模型類型。那麼這是否意味着必須爲每種類型顯示一個單獨的控制器?

回答

4

如果你嚴格按照命名約定,那麼你的假設是正確的,最佳實踐是每個模型的每個視圖都有一個控制器,但是在大多數需求不同的情況下,你也可以偏離該約定,並且滿足你的需要,你可以概念做這樣的事情:

的JavaScript

var App = Ember.Application.create(); 

App.IndexRoute = Ember.Route.extend({ 
    model: function(){ 
    return Ember.Object.create({post: App.Post.find(1), page: App.Page.find(1)}); 
    } 
}); 

App.Store = DS.Store.extend({ 
revision: 12, 
adapter: 'DS.FixtureAdapter' 
}); 

App.Post = DS.Model.extend({ 
title: DS.attr('string'), 
description: DS.attr('string') 
}); 

App.Page = DS.Model.extend({ 
title: DS.attr('string'), 
text: DS.attr('string') 
}); 

App.Post.FIXTURES = [ 
    { 
    id: 1, 
    title: "My super post", 
    description: "Lorem ipsum dolor sit amet..." 
    } 
]; 

App.Page.FIXTURES = [ 
    { 
    id: 1, 
    title: "My super page", 
    text: "Lorem ipsum dolor sit amet..." 
    } 
]; 

模板

<script type="text/x-handlebars"> 
    {{outlet}} 
</script> 

<script type="text/x-handlebars" data-template-name="index"> 
    <h2>{{model.post.title}}</h2> 
    <p>{{model.post.description}}</p> 
    <hr/> 
    <h2>{{model.page.title}}</h2> 
    <p>{{model.post.description}}</p> 
</script> 

這裏工作jsbin該節目的概念。

希望它可以幫助

+1

是不是存在設計缺陷與燼,它試圖將一個模型默認綁定到一個視圖。 MVC的好處之一就是你應該有一個有多個視圖的模型。 – davidbuttar

0

This jsbin顯示了另一種方式來顯示兩種模式:組織模型(與屬性「name」和「說明」)和會員模型(只用「名」屬性)。 JSBin使用本地存儲適配器進行設置,您可以在其中輸入數據。

車把和HTML:

Here are the Orgs: 
    <ul> 
    {{#each model}} 
    <li>{{name}} - {{description}}</li> 
    {{/each}} 
    </ul> 

    Here are the Members: 
    {{#each member in members}} 
    <li>{{member.name}}</li> 
    {{/each}} 

的關鍵是在控制器:

的Javascript:

App.OrganizationRoute = Ember.Route.extend({ 
    model: function() { 
    return App.Org.find(); 
    }, 
    setupController: function(controller, model) { 
    controller.set('members', App.Member.find()); 
    } 
}); 

(基於this answer

+0

我感謝你的努力和你的邏輯是有道理的,但你的jsbin在Chrome中被破壞了。 – StingeyB

相關問題