Aurelia:总是在视图中调用方法(升级后出现问题)
Aurelia: always call method in the view (problems after upgrade)
我们已经升级了Aurelia(特别是aurelia-framework
到1.0.6
,aurelia-bindong
到1.0.3
),现在我们面临一些绑定问题。
有一个带有计算类的元素列表,我们在包含该列表的自定义元素中有一个方法:
getClass(t) {
return '...' +
(this.selected.indexOf(t) !== -1
? 'disabled-option' :
: ''
) + (t === this.currentTag
? 'selected-option'
: ''
);
}
对于列表元素class.one-way="$parent.getClass(t)"
,一切都很好。
升级后,它就停止工作了,所以每当selected
(顺便说一句,它是可绑定的)或currentTag
属性被修改时,getClass
方法就不会被调用。
我通过将这个逻辑移到视图中部分解决了这个问题:
class="${$parent.getClass(t) + (selected.indexOf(t) !== -1 ? 'disabled-option' : '') (t === $parent.currentTag ? 'selected-option' : '')}"
我知道那看起来。。。坏,但这使t === $parent.currentTag
工作,但disabled-option
类仍然没有应用。
所以,问题是:
如何强制Aurelia调用视图中属性中的方法
P.S
我知道这可能会导致一些性能问题。
小提示:
我不能简单地向列表元素添加selected
属性,因为我不想以某种方式修改自定义元素中的数据,而且我基本上希望我的代码能够正常工作,而不会进行太多更改。
UPD
UPD以下是Fabio Luz的精彩解决方案。
export class SelectorObjectClass {
constructor(el, tagger){
Object.assign(this, el);
this.tagger = tagger;
}
get cssClass(){
//magic here
}
}
和
this.shown = this.shown(e => new SelectorObjectClass(e, this));
但我最终得到了这个(定义了一个额外的数组)。
您必须使用属性而不是函数。像这样:
//pay attention at the "get" before function name
get getClass() {
//do your magic here
return 'a b c d e';
}
HTML:
<div class.bind="getClass"></div>
编辑
我知道这可能有些过头了,但这是迄今为止我找到的最好的解决方案:
为您的对象创建一个类:
export class MyClass {
constructor(id, value) {
this.id = id;
this.value = value;
}
get getClass() {
//do your magic here
return 'your css classes';
}
}
使用上面的类创建数组的对象:
let shown = [];
shown[1] = new MyClass('someId', 'someValue');
shown[2] = new MyClass('someId', 'someValue');
现在,您将能够使用getClass
属性:
<div repeat.for="t of shown" class.bind="t.getClass">...</div>
希望它能有所帮助!
看起来很悲伤。
我不理解你在html中计算类的观点。试试那个代码,它会对你有所帮助。
computedClass(item){
return `
${this.getClass(item)}
${~selected.indexOf(item) ? 'disabled-option': ''}
${item === this.currentTag ? 'selected-option' : ''}
`;
}
如果状态为/,您的代码不起作用会导致您首先错过其他选项
更新:要切换属性状态,请尝试selected.bind="true/false"
祝你好运,Egor
Fabio提供了一个很好的解决方案,但它引起了问题(双向绑定到自定义元素的数据(选择的结果)与输入的类型不同,等等)。这肯定是可以修复的,但这将花费大量的时间,并导致重写测试等。或者,是的,我们可以将原始对象作为一些属性等等。。。
无论如何:
还有另一种解决方案,虽然不那么优雅,但实现起来要快得多。
-
让我们声明一个额外的数组
@bindable shownProperties = [];
-
注入
ObserverLocator
-
观察所选阵列
this.obsLoc.getArrayObserver(this.selected) .subscribe(() => this.selectedArrayChanged);
-
更新
shownProperties
isSelected(t) { return this.selected.indexOf(t) !== -1; } selectedArrayChanged(){ for(var i = 0; i < this.shown.length; i++){ this.shownProperties[i] = { selected: this.isSelected(this.shown[i]) } } }
-
最后,在观点上:
class="... ${shownProperties[$index].selected ? 'disabled-option' : '')} ..."
所以,这个故事的寓意是:
不要像我那样在视图中使用方法:)
- 文档.编写方法问题
- 使用Ajax的问题's发送多个值的Post方法
- 在对象中添加方法时出现问题
- 简单的javascript方法问题
- Node.js-异步方法调用问题
- 尝试将变量传递到对象中时的作用域问题'的方法构造函数
- 当服务器从 http 更改为 https 时,有哪些可能的方法可以解决问题
- .attr(“href”) 的问题!解决此问题的简单方法
- 将方法分配给变量和问题
- 随机数生成器,what'我的方法/统计数据有问题吗?[JS]
- 有没有一种方法可以在IE8中解决我的Rails javascript应用程序.js的问题
- 对象中的setInterval出现问题's方法
- 包含方法和突出显示元素的问题
- 谷歌地图API v3 addDomListener方法问题
- 这种计算画布元素中非白色像素的方法有什么问题
- Javascript替换方法有什么问题
- 角度非幂等方法问题
- 将访问令牌添加到主干中的标头时出现问题:它会更改方法
- Android驱动程序的scrollTo和scrollToExact 方法的问题.方法不会滚动到所需的元素文本,而是滚动
- 在集合中引用变量时出现问题.方法在渲染函数中