Javascript 动态创建销售点
假设我有一个具有两条路径的应用程序:“/services”和“/services/:service” 当用户访问:service状态时,我希望他看到与某个特定服务相关的信息列表。到目前为止,微不足道 但是,当相同的用户访问/服务时,我想显示一个服务列表,加上每个服务的信息(每个服务)。我也希望这样做没有任何模板复制 显而易见的答案似乎是插座,但看起来所有插座都必须静态命名,我有一个以前未确定的数量。它们都有唯一的名称,但我当然不能在模板中硬编码名称。我想动态地确定出口名称,这样我就可以在renderTemplate中适当地调用this.render来填充它们,但我不知道怎么做 你有什么建议 更新:看起来我可以使用{{template}}处理我的特殊情况,但这并不能连接到另一条路径,就像这样。我仍然想知道如何做到这一点;稍后我会做更复杂的事情,这肯定会更好,而且在各自的控制器中仍然存在代码重复 更新:我最终制作了自己的“dynOutlet”助手,例如:Javascript 动态创建销售点,javascript,ember.js,Javascript,Ember.js,假设我有一个具有两条路径的应用程序:“/services”和“/services/:service” 当用户访问:service状态时,我希望他看到与某个特定服务相关的信息列表。到目前为止,微不足道 但是,当相同的用户访问/服务时,我想显示一个服务列表,加上每个服务的信息(每个服务)。我也希望这样做没有任何模板复制 显而易见的答案似乎是插座,但看起来所有插座都必须静态命名,我有一个以前未确定的数量。它们都有唯一的名称,但我当然不能在模板中硬编码名称。我想动态地确定出口名称,这样我就可以在rend
// Define "dynamic outlets". These are just like normal outlets,
// except they dereference the outlet name.
Handlebars.registerHelper('dynOutlet', function(property, options) {
Ember.assert("Syntax: {{dynOutlet <property>}}", arguments.length === 2);
var context = (options.contexts && options.contexts[0]) || this,
normalized = Ember.Handlebars.normalizePath(
context, property, options.data),
pathRoot = normalized.root,
path = normalized.path,
value = (path === 'this') ? pathRoot : Ember.Handlebars.get(
pathRoot, path, options);
return Ember.Handlebars.helpers.outlet(value, options);
});
//定义“动态出口”。这些就像普通的插座一样,
//除非他们取消了对门店名称的引用。
把手.注册表帮助器('dynOutlet',功能(属性,选项){
assert(“语法:{{dynOutlet}}”,arguments.length==2);
var context=(options.contexts&&options.contexts[0])| |这,
标准化=余烬。把手。标准化路径(
上下文、属性、选项、数据),
pathRoot=normalized.root,
path=规范化的.path,
值=(路径=='this')?路径根:Ember.handlebar.get(
路径根、路径、选项);
返回余烬。把手。助手。插座(值,选项);
});
不过,我还没有弄清楚它是否能按我想要的方式工作。我还需要定义动态插座。这是我实现的助手:
Ember.Handlebars.registerHelper('dynamicOutlet', function(property, options) {
var outletSource;
if (property && property.data && property.data.isRenderData) {
options = property;
property = 'main';
}
outletSource = options.data.view;
while (!(outletSource.get('template.isTop'))){
outletSource = outletSource.get('_parentView');
}
options.data.view.set('outletSource', outletSource);
var firstContext = options.contexts.objectAt(0);
options.hash.currentViewBinding = '_view.outletSource._outlets.' + firstContext.get(property);
var controller = App.__container__.lookup("controller:movies");
options.contexts.clear();
options.contexts.addObject(controller);
return Ember.Handlebars.helpers.view.call(controller, Ember.Handlebars.OutletView, options);
});
这是我在模板中使用它的方式:
<div>
{{title}} <!-- accessing title property of context -->
{{dynamicOutlet outletName}} <!-- accessing the property that should be used as name of the outlet -->
</div>
{{title}}
{{dynamicoutletname}
这个助手可以使用模型的属性作为插座名称。你能再加一点JSFIDLE吗?我在使JSFIDLE工作时遇到了麻烦。尽管不起作用,也许会给你这个想法。