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

Javascript Emberjs:如何使用变量中的视图名称呈现视图?,javascript,ember.js,Javascript,Ember.js,我想添加一些卡到一个董事会,所有的卡是非常不同的。所以我想为每个卡创建不同的视图,可以绑定不同的事件和模板。我在卡片模型中设置了一个“type”属性来区分卡片 板模板如下所示: {{#each card in cards}} {{render card.type card class="card"}} {{/each}} 但是,渲染帮助的第一个参数不能是变量,它只能是卡视图名称字符串 有人知道如何做到这一点吗 正如您已经提到的,内置的render帮助程序只接受一个字符串来查找要渲染的模板,

我想添加一些卡到一个董事会,所有的卡是非常不同的。所以我想为每个卡创建不同的视图,可以绑定不同的事件和模板。我在卡片模型中设置了一个“type”属性来区分卡片

板模板如下所示:

{{#each card in cards}}
  {{render card.type card class="card"}}
{{/each}}
但是,渲染帮助的第一个参数不能是变量,它只能是卡视图名称字符串


有人知道如何做到这一点吗

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

Ember.Handlebars.registerBoundHelper('renderCard', function(context, card, options) {
  return Ember.Handlebars.helpers.render.call(context, card.get('type'), 'card', options);
});
App.Adapter = DS.RESTAdapter.extend();

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

App.Store = DS.Store.extend({
  adapter: App.Adapter
});
之后,您可以在模板中这样使用它:

{{#each card in cards}}
  {{renderCard this card}}
{{/each}}
= hb 'renderDynamic "this" currentModel contextString="curremtModel"
编辑 我还添加了一个basic,显示它可以工作

编辑2 再次编辑jsbin,使用要呈现到模板中的对象数据

编辑3 遗憾的是,
DS.FixtureAdapter
不支持
嵌入的
记录,这正是使其工作所需的。但您可以将原始
DS.RESTAdapter
配置为:

Ember.Handlebars.registerBoundHelper('renderCard', function(context, card, options) {
  return Ember.Handlebars.helpers.render.call(context, card.get('type'), 'card', options);
});
App.Adapter = DS.RESTAdapter.extend();

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

App.Store = DS.Store.extend({
  adapter: App.Adapter
});
这样,
记录总是与父记录一起加载。我猜这样做会调用
card.get('type')
在你的车把助手中返回值,而不是
未定义的值


希望有帮助。

对于上面的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)
在模板中:

{{#each card in cards}}
  {{renderCard this card}}
{{/each}}
= hb 'renderDynamic "this" currentModel contextString="curremtModel"
或在把手上:

{{renderDynamic "this" currentModel contextString="curremtModel"}}

您好,我尝试了您提供的帮助程序代码,但在渲染调用时它似乎不起作用。我的答案中有一个拼写错误,现已修复,抱歉:)是的,我意识到模板中缺少上下文。我修复了这个问题,但仍然得到错误消息:uncaughttypeerror:Object[Object Object]没有方法“match”。我更新的代码如下:
Ember.handlebar.helper('renderCard',函数(上下文、类型、卡片、选项){if(类型和卡片)返回Ember.handlebar.helpers.render.call(上下文、类型、卡片、选项);})
@ZheX您更新的代码有点错误,如果您像这样传递
类型
,您没有得到所需的字符串,请使用一个工作的jsbin来更新我的答案。我查看了您的演示代码,这很好。但是当我使用嵌套的卡片模型列表(有很多)时,我无法得到
card.get(“type”)
,它总是
未定义的
。我已经编辑了我的答案,包括一个工作的jsbin,看一看,我刚刚对jsbin进行了另一次编辑(编辑2),同时使用对象的数据在模板中与{data}一起使用,现在一切都是动态的,希望有帮助。在ember 1.13 view.getStream,你知道我们应该用什么吗?谢谢