Rad*_*duM 9 javascript model-view-controller templates ember.js
所以我有以下设置.
在主页面上,基于来自使用夹具数据的模型的列表显示生成器列表.
现在,当单击其中一个生成器链接时,将显示一个新页面,其中包含一些基于该夹具数据动态生成的输入字段.
在此之前一切都很完美.
现在,当我更改生成器页面中的输入字段值(选择其中一个生成器之后)以查看正在我的输入字段下方的某种预览div中更新的更改时,这很容易.我可以{{generatorFields.0.value}}用来绑定第一个输入字段,.1.等等,直到我绑定它们.
但是你可以想象,每个生成器都有自己的格式和自己的输入字段,我想为它们中的每一个创建一个新的.hbs文件,然后将该文件传递到生成器页面以显示预览.
我解决了部分问题的0.1%.在我输入的generator.hbs文件中{{partial "generator-1"}},这将加载_generator-3.hbs包含该{{generatorFields.0.value}}绑定的文件,并且它可以正常工作.但那部分不是动态的; 每次我使用不同的发生器时,我需要加载不同的部分.我怎样才能做到这一点?
如何动态传递部分名称或根据我拥有的模型数据加载模板?
到目前为止使用的代码如下:
idex.hbs看起来像这样:
<table class="table table-hover">
<thead>
<tr>
<th>#</th>
<th>Generator name</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{{#each model}}
<tr>
<td>{{id}}</td>
<td>{{title}}</td>
<td>{{#linkTo 'generator' this classNames="btn btn-mini pull-right"}}Create file{{/linkTo}}</td>
</tr>
{{/each}}
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
generator.hbs
{{#each generatorFields}}
<div class="row-fluid">
<div class="span4">{{name}}</div>
<div class="span8">{{view Ember.TextField valueBinding='value' class='span12' placeholder='Type value here…'}}</div>
</div>
{{/each}}
{{partial "generator-1"}}
Run Code Online (Sandbox Code Playgroud)
_generator-1.hbs
<h1>Project: {{generatorFields.0.value}}</h1>
Run Code Online (Sandbox Code Playgroud)
app.js
App.Store = DS.Store.extend({
revision: 13,
adapter: 'DS.FixtureAdapter'
});
App.Router.map(function () {
this.resource('index', { path: '/' });
this.resource('generator', {path: '/generator/:generator_id'});
});
App.IndexRoute = Ember.Route.extend({
model: function () {
return App.Generator.find();
}
});
App.Generator = DS.Model.extend({
title: DS.attr('string'),
templateName: DS.attr('string'),
generatorFields: DS.attr('generatorFields')
});
// Fixture data
DS.RESTAdapter.registerTransform('generatorFields', {
serialize: function(serialized) {
return Em.none(serialized) ? {} : serialized;
},
deserialize: function(deserialized) {
return Em.none(deserialized) ? {} : deserialized;
}
});
App.Generator.FIXTURES = [{
id: 1,
title: "test 1",
generatorFields: [
{id: 1, name: "name 1", value: ""}
],
templateName: "generator-1"
}, {
id: 2,
title: "test 2",
generatorFields: [
{id: 1, name: "name 1", value: ""},
{id: 2, name: "name 2", value: ""},
],
templateName: "generator-2"
}];
Run Code Online (Sandbox Code Playgroud)
Dar*_*kar 15
您可以创建一个动态部分帮助器,它使用传入的名称来使用{{partial}}帮助器进行渲染.
Ember.Handlebars.helper('dynPartial', function(name, options) {
return Ember.Handlebars.helpers.partial.apply(this, arguments);
});
Run Code Online (Sandbox Code Playgroud)
然后使用这个动态部分{{dynPartial}}.
{{#each item in controller}}
{{dynPartial item.templateName}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)
对于与发电机templateName的generator-1.这将使用部分渲染_generator-1.请注意,模板的id/data-template-name的名称必须以下划线开头.
您应该能够简单地将动态部分变量放在部分帮助器中.
{{#each item in controller}}
{{partial item.templateName}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)
正如@darshan-sawardekar所指出的那样,如果你有一个发电机templateName,generator-1那将会产生部分_generator-1.
| 归档时间: |
|
| 查看次数: |
8030 次 |
| 最近记录: |