Ember - 根据数组中的值通过不同的模板呈现产品
Ember - Render products through different templates based on a value in the array
为了这个问题,我简化了我的应用程序。我才刚刚开始思考 Ember,而且我还没有尽可能高效地做事,我敢肯定。
我正在寻找一种方法来为具有某些特征的条目使用不同的模板。让我解释一下:
我有一个嵌套路由如下:
App.Router.map(function(){
this.resource('products', function() {
this.resource('product', { path: '/:product_id' });
});
});
和这样的 JSON 文件:
{"product": [
{
"id": 1,
"title": "Bicycle",
"description": "A nice red bicycle that you can ride on.",
"display": "textonly"
},
{
"id": 2,
"title": "Bus",
"description": "A big bus that many people can ride on."
"display": "bigblocks"
},
{
"id": 3,
"title": "Airplane",
"description": "You can fly in this to get to your destination faster",
"display": "textonly"
}
]
}
如您所见,我在 JSON 中添加了一个 属性 来确定产品条目的显示方式。
现在,我的 html 模板如下所示:
<script type='text/x-handlebars' data-template-name='products'>
<div class='row'>
<div class='col-md-3'>
<div class='list-group'>
{{#each}}
{{#link-to 'product' this classNames='list-group-item'}}
{{title}}
{{/link-to}}
{{/each}}
</div>
</div>
<div class='col-sm-9'>
{{outlet}}
</div>
</div>
</script>
<script type='text/x-handlebars' data-template-name='product'>
<div class ='row'>
<div class ='col-md-9'>
<h4>{{title}}</h4>
<p>{{description}}</p>
</div>
</div>
</script>
我的应用目前呈现如下:
现在,我想做的是通过不同的模板(或视图或组件或任何最适合该工作的东西)渲染一些产品,以便 "display": "bigblocks"
渲染的产品略有不同比 "display": "textonly"
像这样:
所以实际上,我想要很多 JSON 条目,并根据它们在 JSON 文件中的 'display' 值以不同方式呈现它们。
我现在只是在寻找一种非常简单的方法来执行此操作,也许是 IF 语句或类似的东西,这样我就可以了解如何完成此操作。
非常感谢,如果需要,请询问更多信息:)
您可以使用控制器上的计算 属性 和模板中的条件逻辑来完成您想要的。
在您的产品控制器中包含以下计算的 属性:
isDisplayTextOnly: function(){
return this.get('display') === 'textonly';
}.property('model.display')
向您的产品模板添加条件逻辑,以便它根据控制器中计算的值以不同的格式显示:
{{#if isDisplayTextOnly}}
<!-- What you want displayed when "display" == "textonly" -->
{{else}}
<!-- What you want displayed when "display" == "bigblocks" or anything else -->
{{/if}}
组件允许您指定 templateName
。因此,您可以根据 display
属性 的值计算模板名称,如下所示:
App.XDisplayComponent = Ember.Component.extend({
tagName: "",
templateName: function(){
return this.get('item.display');
}.property('item'),
});
您将按如下方式使用该组件:
<script type="text/x-handlebars" data-template-name="index">
<ul>
{{#each item in model}}
<li>{{item.name}} {{ x-display item=item}} </li>
{{/each}}
</ul>
</script>
查看工作演示 here
为了这个问题,我简化了我的应用程序。我才刚刚开始思考 Ember,而且我还没有尽可能高效地做事,我敢肯定。
我正在寻找一种方法来为具有某些特征的条目使用不同的模板。让我解释一下:
我有一个嵌套路由如下:
App.Router.map(function(){
this.resource('products', function() {
this.resource('product', { path: '/:product_id' });
});
});
和这样的 JSON 文件:
{"product": [
{
"id": 1,
"title": "Bicycle",
"description": "A nice red bicycle that you can ride on.",
"display": "textonly"
},
{
"id": 2,
"title": "Bus",
"description": "A big bus that many people can ride on."
"display": "bigblocks"
},
{
"id": 3,
"title": "Airplane",
"description": "You can fly in this to get to your destination faster",
"display": "textonly"
}
]
}
如您所见,我在 JSON 中添加了一个 属性 来确定产品条目的显示方式。
现在,我的 html 模板如下所示:
<script type='text/x-handlebars' data-template-name='products'>
<div class='row'>
<div class='col-md-3'>
<div class='list-group'>
{{#each}}
{{#link-to 'product' this classNames='list-group-item'}}
{{title}}
{{/link-to}}
{{/each}}
</div>
</div>
<div class='col-sm-9'>
{{outlet}}
</div>
</div>
</script>
<script type='text/x-handlebars' data-template-name='product'>
<div class ='row'>
<div class ='col-md-9'>
<h4>{{title}}</h4>
<p>{{description}}</p>
</div>
</div>
</script>
我的应用目前呈现如下:
现在,我想做的是通过不同的模板(或视图或组件或任何最适合该工作的东西)渲染一些产品,以便 "display": "bigblocks"
渲染的产品略有不同比 "display": "textonly"
像这样:
所以实际上,我想要很多 JSON 条目,并根据它们在 JSON 文件中的 'display' 值以不同方式呈现它们。
我现在只是在寻找一种非常简单的方法来执行此操作,也许是 IF 语句或类似的东西,这样我就可以了解如何完成此操作。
非常感谢,如果需要,请询问更多信息:)
您可以使用控制器上的计算 属性 和模板中的条件逻辑来完成您想要的。
在您的产品控制器中包含以下计算的 属性:
isDisplayTextOnly: function(){
return this.get('display') === 'textonly';
}.property('model.display')
向您的产品模板添加条件逻辑,以便它根据控制器中计算的值以不同的格式显示:
{{#if isDisplayTextOnly}}
<!-- What you want displayed when "display" == "textonly" -->
{{else}}
<!-- What you want displayed when "display" == "bigblocks" or anything else -->
{{/if}}
组件允许您指定 templateName
。因此,您可以根据 display
属性 的值计算模板名称,如下所示:
App.XDisplayComponent = Ember.Component.extend({
tagName: "",
templateName: function(){
return this.get('item.display');
}.property('item'),
});
您将按如下方式使用该组件:
<script type="text/x-handlebars" data-template-name="index">
<ul>
{{#each item in model}}
<li>{{item.name}} {{ x-display item=item}} </li>
{{/each}}
</ul>
</script>
查看工作演示 here