如何在列表中渲染模型的模板,仅在模型的路径上?

时间:2013-05-12 14:58:00

标签: ember.js

我正在迭代entries的列表,并希望显示列表中每个条目的内容,但仅限于相应条目的路径上。

即。 - 在路线/entries/2

* link to entry 1
* link to entry 2

  content for entry 2

* link to entry 3

不幸的是,似乎我无法在{{outlet}}循环中使用{{#each entry}}

最初我尝试在路由的isActive内将setupController设置为true,并在模板中检查它,但似乎没有一种好方法可以在您删除该标记时导航到/entries/3deactivate仅在完全离开/entries/:entry_id时才有效。有关详情,请参阅Is there an opposite of setupController?

使用Ember做到这一点的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

您可以使用带有itemController的{​​{1}}并在该项控制器上设置计算属性,以确保当前{{each}}属性等于model当前模型

所以你将有以下路线设置:

App.EntryRoute

以下模板:

App.Router.map(function() {
    this.resource('entries', { path: '/'}, function() {
      this.resource('entry', { path: ':entry_id' });
    });
});

不需要做的是创建<script type="text/x-handlebars" id="entries"> {{#each controller itemController="entryItem"}} {{#linkTo "entry" this}}{{name}}{{/linkTo}} <br /> {{#if isSelected}} {{details}} <br /><br /> {{/if}} {{/each}} 控制器并添加计算属性App.EntryItem,如果当前路由模型=== isSelected

,则应返回true

类似的东西:

model

以上是适用于上述所有内容的小提琴:

http://jsfiddle.net/teddyzeenny/T2EyK/1/

答案 1 :(得分:0)

我通过以下方式实现了解决方案。 请告诉我代码中的任何缺点。 我在调用入口路径时将属性设置为Entry模型,以使其可见。

HTML:

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

<script type="text/x-handlebars" id="entries">
    {{#each controller }}
        {{#linkTo "entry" this}}{{name}}{{/linkTo}} <br />
        {{#if visi}}
            <p>{{details}}</p>
        {{/if}}
    {{/each}}
</script>

JAVASCRIPT:

App = Ember.Application.create();

App.Router.map(function(){
    this.resource('entries', { path: '/'}, function() {
        this.resource('entry', { path: 'entry/:entry_id' });
    });
});

App.Entry = Em.Object.extend({
    id: null,
    name: null,
    details: null
});

App.entries =[
    App.Entry.create({
        id: 1,
        name: 'entry 1',
        details: 'details 1'
    }),
    App.Entry.create({
        id: 2,
        name: 'entry 2',
        details: 'details 2'
    }),
    App.Entry.create({
        id: 3,
        name: 'entry 3',
        details: 'details 3'
    })
];

App.EntriesRoute=Ember.Route.extend({

    model:function() {
        return App.entries;
    }
});

App.EntryRoute=Ember.Route.extend({

    model:function(params) { 
        var id=parseInt(params.entry_id);
        return App.entries.findProperty('id',id);
    },

    setupController:function(controller,model){
        App.entries.setEach('visi',false);
        model.set('visi',true);
    }
});

问候。