我的问题是,当addon被用于另一个addon的依赖项时,我无法让addon中的contentFor方法运行(我知道这让人困惑)。
我的组织有一个内部成员加注,我们使用它来为我们的成员应用程序分发共同的样式、图像和组件。我把这句话称为org-components。我们已经决定采用材料设计,所以我们选择使用余烬纸和我们现有的插件。
为了减少在摄入应用程序中需要引用的受抚养人的数量,我们倾向于将ember-paper作为org-components (而不是devDependency)的依赖项。
因此,我们的依赖链是这样的:
ember-paper -> org-components -> ember-engine
ember-paper有一个在~/index.js中定义的contentFor方法,它将为头部中的材料图标和字体注入两个样式表,并将paper-wormhole div注入到body-footer中,供选择菜单下拉列表和the消息使用。由于不知道的原因,当contentFor作为依赖项包含时,ember-paper方法不会执行,如上面所示。
当我将这两个组件作为独立的依赖项包含时,将执行contentFor方法并按预期工作:ember-paper -> ember-engine org-components -> ember-engine
因此,我想了解为什么当ember-paper作为我们现有addon的依赖项时,无法利用它。是什么阻止了contentFor构建步骤的执行?当我试图解决这个问题时,我应该记住它们是一个最佳实践吗?
发布于 2017-11-03 15:54:11
我最终找到了解决这个问题的方法,这要归功于安博团队的罗伯特杰克逊。
在向Ember Slack社区寻求帮助之后,Robert让我意识到,成员引擎中现有的contentFor功能还没有扩展到处理这个用例。他承认这是一个疏忽,他们很可能会在将来添加这些功能,但目前他为我提供了一个可以添加到/lib/engine-addon.js中的变通方法。
options.contentFor = function(type, config) {
let deprecatedHooks = ['app-prefix', 'app-suffix', 'vendor-prefix', 'vendor-suffix'];
if (deprecatedHooks.indexOf(type) > -1) {
// ember-engines does not support the deprecated contentFor hooks
return '';
}
let content = [];
if (type === 'head') {
let engineConfig = this.engineConfig(config.environment, {});
let escapedConfig = escape(JSON.stringify(engineConfig));
content = content.push(
`<meta name="${options.name}/config/environment" content="${escapedConfig}" />`
);
}
content = this.addons.reduce((content, addon) => {
let addonContent = addon.contentFor ? addon.contentFor(type, config, content) : null;
if (addonContent) {
return content.concat(addonContent);
}
return content;
}, content);
return content.join('\n');
};也可作为要旨使用。
我没有跟上馀烬引擎的开发路线图,也没有把它添加到比我们目前使用的更晚的版本中。正如前面提到的,安伯斯拉克的人是非常有帮助的,如果你有这些问题的话,他们会给你指明正确的方向。
https://stackoverflow.com/questions/45551371
复制相似问题