2017-08-07 134 views
1

我的问题是,当插件在另一个插件的依赖中使用时,我无法获取addon中的contentFor方法(令人困惑,我知道)。在Ember插件依赖链中的ember-cli和contentFor方法

我的组织有一个内部的烬插件,我们用它来为我们的烬应用程序分发常见样式,图像和组件。我将把该插件称为org-components。我们决定采用材料设计,所以我们选择使用ember-paper以及我们现有的插件。

为了降低人的依赖关系将需要在摄取应用程序以引用的数量,我们宁愿包括ember-paperorg-components依赖(不是devDependency)。

因此,我们依赖链去像这样:

ember-paper -> org-components -> ember-engine

ember-paper~/index.js定义的contentFor方法将注入一对夫妇样式在头材质的图标和字体和paper-wormhole的div到body-footer为由选择菜单下拉菜单和Toast消息使用。由于我不知道的原因,当ember-paper作为依赖关系包含在内时,contentFor方法不会执行,如上所示。

当我包括这两个组件作为单独的依赖关系,然后执行contentFor方法和工作的事情如预期: ember-paper -> ember-engine org-components -> ember-engine

因此,我看明白了,为什么我不能充分利用ember-paper插件使用时作为我们现有插件的依赖。什么是阻止contentFor构建步骤被执行?在尝试解决这个问题时,我应该记住他们的最佳做法吗?

+0

在它不起作用的情况下,'org-components'插件中是否包含'ember-paper'? – Dhaulagiri

回答

0

感谢来自Ember团队的总是乐于助人的Robert Jackson,我终于找到了解决这个问题的办法。

在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'); 
}; 

也可作为Gist

我还没有跟上的开发路线图烬,引擎还是这已经加入到更高版本比我们目前使用的。如上所述,Ember Slack中的人员非常有帮助,并且如果您有这些问题,会指引您朝着正确的方向发展。