Ember.JS - 如何使用多个模型,控制器和视图在同一个页面? [英] Ember.JS - How to use multiple models, controllers and views in same page?

查看:122
本文介绍了Ember.JS - 如何使用多个模型,控制器和视图在同一个页面?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我大多理解Ember.JS的基础知识。大多数的例子在那里真的只是对付单个控制器和模型显示网页上的东西。我真的建立一个完整的Web应用程序与Ember经过这么谁能告诉我我怎么组织并连接多个控制器,模型和视图到一个单一的页面?

I mostly understand the basics of Ember.JS. Most examples out there really just deal with a single controller and a model to show something on a page. I am really after building a full web app with Ember so can anyone tell me how do I organize and connect multiple controllers, models and views into a single page?

例如,如果我浏览到/应用/职位,我想显示导航栏与一堆东西,包括一些信息记录,侧边栏与连接到它的控制器,中列出一堆职位搜索中间也许填充侧边栏上有一个TwitterFeedController Twitter的饲料。

For example, if I navigate to /app/posts, I want to show a navigation-bar with bunch of things including some logged in information, a sidebar to search with a controller attached to it, a bunch of posts listed in the middle and maybe a twitter feed populated on the sidebar with a TwitterFeedController.

我如何连接这些一堆在一起。什么是实现节用自己的控制器和模型和视图中Ember.JS?

How do I connect a bunch of these together. What is the basic way to achieve "Sections" with their own controllers and models and views in Ember.JS?

据我了解有一个名为网点。当前文档似乎没有提到它过去在其应用程序模板主{{outllet}}。我找不到他们的公共API文档的定义太(可能是盲目的...)。

I understand there's named "outlets". Current documentation doesn't seem to mention it past having a main {{ outllet }} in application template. I can't find the definition on their public API docs too (might be blind...).

在此先感谢!

推荐答案

希望这回答例1 而这一次太<一个HREF =htt​​p://jsfiddle.net/rlivsey/QWR6V/>例2

Hope this answers Example1 and this one too Example2

<script type="text/x-handlebars" data-template-name="application">
    {{partial 'navbar'}}
    {{outlet}}   
    {{partial 'footer'}}
</script>

<script type="text/x-handlebars" data-template-name="_navbar">
    <div class="navbar navbar-inverse">
        <div class="navbar-inner">
            {{#linkTo "app" class="brand"}}{{unbound App.app_title}}{{/linkTo}}
            <ul class="nav">
                <li class="divider-vertical">
                    {{#linkTo "app"}}Home{{/linkTo}}
                </li>
                <li class="divider-vertical">
                    {{#linkTo "products"}}Products{{/linkTo}}
                </li>
            </ul>
        </div>
    </div>
</script>

<script type="text/x-handlebars" data-template-name="_footer">
    <div class="row">
        <div class="span12">
            &copy; 2013:1.0-pre4 - {{unbound App.contact}} 
        </div>
    </div>    
</script>

<script type="text/x-handlebars" data-template-name="app">
    <h2>Home</h2>
    <p>Bacon ipsum dolor sit amet tenderloin short ribs short loin meatball sausage chicken pastrami. Hamburger sausage tri-tip, bacon spare ribs bresaola short ribs chuck frankfurter shoulder. Fatback pork belly turducken, ham drumstick salami hamburger pork sausage. Jowl corned beef andouille shank boudin. Shankle salami corned beef, pastrami leberkas turducken venison shoulder fatback jowl ball tip ground round biltong andouille boudin.</p>
    <p>Biltong boudin turkey rump shankle ball tip, strip steak drumstick spare ribs. Cow short ribs leberkas swine sirloin shank drumstick rump hamburger frankfurter ham hock. Bresaola turkey bacon prosciutto salami jowl pancetta meatloaf ground round ball tip filet mignon kielbasa tongue chuck strip steak. T-bone leberkas beef ribs kielbasa shankle pork chop spare ribs chuck strip steak shoulder frankfurter turducken. Pork loin ham cow chicken boudin venison. Filet mignon cow jowl pig ball tip, meatball boudin leberkas ham short loin drumstick tenderloin venison chicken. Chuck beef filet mignon capicola shankle, fatback flank ham hock corned beef meatloaf short ribs bacon.</p>
</script>

<script type="text/x-handlebars" data-template-name="categories">
    <h2>Categories</h2>
    <p>Listing available products and services</p>
    <ul class="thumbnails">
    {{#each category in controller}}
        <li class="span3">
            <div class="thumbnail">
                <h4>{{category.name}}</h4>
                <img {{bindAttr src="category.imageUrl" alt="category.name"}} />
                {{#linkTo "products.category" category class="btn"}}
                    Details
                {{/linkTo}}
            </div>
        </li>
    {{else}}
        <li>Loading...</li>
    {{/each}}
    </ul>
    <hr />
</script>

<script type="text/x-handlebars" data-template-name="products">
    {{render categories}}
    {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="products/index">
    <h2>Products</h2>
    <ul class="thumbnails">
    {{#each product in controller}}
        <li class="span3">
            <div class="thumbnail">
                <h4>{{product.name}}</h4>
                <img {{bindAttr src="product.imageUrl" alt="product.name"}} />
                {{#linkTo "products.product" product class="btn"}}
                    Details
                {{/linkTo}}
            </div>
        </li>
    {{else}}
        <li>Loading...</li>
    {{/each}}
    </ul>
</script>

<script type="text/x-handlebars" data-template-name="products/product">
    <h4><em style="color: gray">Products</em>/<em style="color: gray">Category: {{category.name}}</em>/{{name}}</h4><br />
    <img {{bindAttr src="imageUrl" alt="name"}}/>
    $ {{price}} hahahahaha
</script>

<script type="text/x-handlebars" data-template-name="products/category">
    <h2>{{name}}</h2>
</script>

<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="https://raw.github.com/wycats/handlebars.js/1.0.rc.2/dist/handlebars.js"></script>
<script type="text/javascript" src="https://raw.github.com/emberjs/ember.js/release-builds/ember-1.0.0-pre.4.js"></script>
<script type="text/javascript" src="https://raw.github.com/MilkyWayJoe/ember.js/master/ember.min.js"></script>


var BaseApp = Em.Application.extend({
    app_title: 'Auto Web Shop',
    contact: function() {
        if(this.get('link') !== '') {
            var html = '<a href="%@" target="_blank">%@</a>'
                       .fmt(this.get('link'), this.get('author'));
            return new Handlebars.SafeString(html);
        } else {
            return this.get('author');
        }
    }.property('author', 'link') 
});

// Extensions - End

window.App = BaseApp.create({
    author: 'Your Name Here',
    link: 'https://twitter.com/torontoemberjs'
});

// Controllers - Begin

App.ShopController = Em.ArrayController.extend();
App.ProductsController = Em.ArrayController.extend();
App.ProductsIndexController = Em.ArrayController.extend();
App.CategoriesController = Em.ArrayController.extend();

// Controllers - End

// Routes - Begin

App.Router.map(function() {
    this.resource('app');
    this.resource('products', function() {
        this.route('product', {path: 'product/:product_id'});
        this.route('category', {path: 'category/:category_id'})
    });
});

App.ApplicationRoute = Em.Route.extend({
  setupController: function() {
      this.controllerFor('categories').set('model', App.Category.find());
  }
});

App.ProductsIndexRoute = Em.Route.extend({
    model: function() {
        return App.Product.find();
    }
});

App.IndexRoute = Em.Route.extend({
    redirect: function() {
        this.transitionTo('app');   
    }
});

// Routes - End

// Models - Begin

// Defining a Data Store for the application from DS namespace
App.Store = DS.Store.extend({
    // Until Ember reaches 1.0, Ember-Data will use a revisions to 
    // alert developers about breaking changes to the API. At the time I'm 
    // writing this, Ember-Data is on revision 11. To find out more, go to:
    // https://github.com/emberjs/data/blob/master/BREAKING_CHANGES.md
    revision: 11,
    // Define your adapter. The Adapter is responsible to 'translate' the data from
    // your backend API into what Ember-Data needs in order for it to work. Ember-Data
    // comes with a REST Adapter and a Fixture Adapter, the later is very useful for 
    // debugging and for mocking up an application. This example uses the Fixture Adapter
    adapter: 'DS.FixtureAdapter'
});

App.Category = DS.Model.extend({
    name: DS.attr('string'),    
    imageUrl: DS.attr('string'),
    products: DS.hasMany('App.Product')
});

App.Product = DS.Model.extend({
    name: DS.attr('string'),
    imageUrl: DS.attr('string'),
    price: DS.attr('number'),
    category: DS.belongsTo('App.Category')
});

// Loading sample data
// Note that all fixtures have an `id` property. That's because Ember-Data needs your 
// models to have an Id, but you don't define it on your model classes.
App.Category.FIXTURES = [
    {
        id: 1, 
        name: 'Air Conditioners', 
        imageUrl: 'http://img9.imageshack.us/img9/1207/howtoreplaceyourcarairc.jpg', 
        products: []
    },
    {    
        id: 2,
        name: 'Tires', 
        imageUrl: 'http://img526.imageshack.us/img526/5290/r8wheel1ljpg0f089f10250.jpg', 
        products: []
    },
    {
        id: 3, 
        name: 'Brakes', 
        imageUrl: 'http://img651.imageshack.us/img651/5600/brakes.gif', 
        products: []
    },
    {
        id: 4,
        name: 'Exhausts', 
        imageUrl: 'http://img217.imageshack.us/img217/7366/carbon20fibre20exhaust2.jpg', 
        products: []
    },
    {
        id: 5, 
        name: 'Batteries', 
        imageUrl: 'http://img842.imageshack.us/img842/268/t2ec16nhjhqe9nzej50bqu7.jpg', 
        products: []
    },
    {
        id: 6,
        name: 'Wipers', 
        imageUrl: 'http://img145.imageshack.us/img145/3750/1208764x64.jpg', 
        products: []
    },
    {
        id: 7, 
        name: 'GPS', 
        imageUrl: 'http://img687.imageshack.us/img687/8899/kgrhqroifcpor3cm0bq1ufc.jpg',
        products: [701,702,703]
    }, 
    {
        id: 8,
        name: 'Windshields',
        imageUrl: 'http://img405.imageshack.us/img405/6826/windshield3thumb.jpg',
        products: []
    }
];

App.Product.FIXTURES = [
    {
        id: 201,
        name: 'Pirelli P4 Four Seasons',
        category: 2,
        price: 9999,
        imageUrl: 'http://img4.imageshack.us/img4/4372/pirellip4fourseasonslg.jpg'
    },
    {
        id: 701, 
        name: 'Tomtom Start 4.3" GPS (45TM)', 
        category: 7, 
        price: 12999, 
        imageUrl: 'http://img856.imageshack.us/img856/7471/seeq2501.jpg'
    },
    {
        id: 702, 
        name: 'Garmin nüvi 4.3" GPS (40)', 
        category: 7,
        price: 11999, 
        imageUrl: 'http://img27.imageshack.us/img27/5116/88121963.jpg'
    },
    {
        id: 703, 
        name: 'Magellan RoadMate 2230T 4.3" GPS ', 
        category: 7, 
        price: 14399, 
        imageUrl: 'http://img820.imageshack.us/img820/7981/36361380.png'
    }
];

// Models - End



// Views - Begin

// Views - End

这篇关于Ember.JS - 如何使用多个模型,控制器和视图在同一个页面?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆