Emberjs:如何使用变量中的视图名称呈现视图?

时间:2013-06-22 15:46:46

标签: javascript ember.js

我想在电路板上添加一些卡片,所有卡片都非常不同。所以我想为每张可以绑定不同事件和模板的卡片创建不同的视图。我在卡片模型中设置了一个'type'属性来区分卡片。

董事会模板如下所示:

{{#each card in cards}}
  {{render card.type card class="card"}}
{{/each}}

但是,渲染帮助的第一个参数不能是变量,它只能是卡片视图名称字符串。

谁知道怎么做到这一点?

2 个答案:

答案 0 :(得分:2)

正如您已经提到的,内置render帮助程序只接受一个字符串来查找要呈现的模板,因此一种可能的解决方案是编写自己的自定义render帮助程序,然后获取card.get('type')的正确名称将呈现委托给内置render帮助程序。这看起来像这样:

Ember.Handlebars.registerBoundHelper('renderCard', function(context, card, options) {
  return Ember.Handlebars.helpers.render.call(context, card.get('type'), 'card', options);
});

之后,您可以在模板中使用它:

{{#each card in cards}}
  {{renderCard this card}}
{{/each}}

修改

我还添加了一个显示正常工作的基本jsbin

编辑2

再次编辑jsbin,使用对象数据渲染到模板中see here

编辑3

可悲的是,DS.FixtureAdapter不支持embedded记录,这是您需要的记录。但是你可以像这样配置你的DS.RESTAdapter

App.Adapter = DS.RESTAdapter.extend();

App.Adapter.map('App.Dashboard',
  cards: {embedded: 'always'}
);

App.Store = DS.Store.extend({
  adapter: App.Adapter
});

这样card记录always加载了父记录。我想这样做会改变你手柄助手中对card.get('type')的调用会返回值而不是undefined

希望它有所帮助。

答案 1 :(得分:0)

对于Ember 1.9上面的解决方案并不起作用。使用其他方式注册助手:

Ember.Handlebars.registerHelper 'renderDynamic', (context, model, options)->
  contextString = options.hash.contextString
  model = options.data.view.getStream(model).value()
  return Ember.Handlebars.helpers.render(model.get('type'), contextString, options)

在模板中:

= hb 'renderDynamic "this" currentModel contextString="curremtModel"

或在把手中:

{{renderDynamic "this" currentModel contextString="curremtModel"}}
相关问题