在4.7.0中Font Awesome 5的升级过程中,我注意到我给<i>
标签的任何类绑定都不像以前那样起作用。
想象一下带有类绑定的以下元素:
<i class.bind="iconClass"></i>
假设iconClass
的初始值为'fas fa-cog'
。将iconClass
的值更改为'fas fa-ship'
时,图标将不会更新为新设置的图标类。它仍将是 cog 图标。
我相信这是因为Font Awesome 5用<i>
标签替换<svg>
标签,并且不会正确复制类绑定,因此不会触发图标更改。
在以下示例中,两秒后更改绑定类以说明问题,请参阅this GistRun以获取问题示例。有关实施,请参阅app.html
和app.js
。它还包含一个肮脏的解决方法。
如何/应该实施此行为?
答案 0 :(得分:2)
受到使用innerhtml
的@huocp答案的启发。
使用自定义组件来解决此问题确实有效。但是,因为我在项目中只有一个带有类绑定的图标,所以我找到了一种更简单的方法:
<i innerhtml="<i class='${iconClass}'></i>"></i>
iconClass
值的更改将在父级中生成新的<i>
子级(同时替换旧的<svg>
元素),之后Font Awesome 5将转换此{{1}将孩子变成<i>
。
当然,任何元素都可以用作父元素和子元素,我只是认为<svg>
看起来简洁干净,它会将Font Awesome 5生成的<i>
嵌套在<svg>
中
答案 1 :(得分:1)
之前我遇到了完全相同的问题。
正如你所说,你正在使用“svg with js”(fa5推荐方式)。它确实打击了Aurelia,因为svg版本使用JavaScript来替换DOM元素,Aurelia的绑定与旧的DOM元素一起被破坏。
切换到“带css的网络字体”,fa5支持完美。它将遵循你的命令为fa4。
答案 2 :(得分:1)
请在此处查看gistrun:https://gist.run/?id=55559f3bd606aa854502f3ddbbcad480
像这样使用这个自定义组件。
<fa-svg icon-class.bind="iconClass"></fa-svg>
FA-svg.js
import {inject, inlineView, bindable} from 'aurelia-framework';
@inject(Element)
@inlineView("<template></template>")
export class FaSvg {
@bindable iconClass;
constructor(element) {
this.element = element;
}
iconClassChanged(newIcon) {
if (!this.live) return;
this._rebuild(newIcon);
}
attached() {
this.live = true;
this._rebuild(this.iconClass);
}
detached() {
this.live = false;
}
_rebuild(iconClass) {
this.element.innerHTML = iconClass ? `<i class="${iconClass}"></i>` : '';
}
}