Aurelia:更改为空值时删除数组元素

Aurelia:更改为空值时删除数组元素,aurelia,Aurelia,我有一个绑定到输入元素的字符串数组: 我需要在删除输入内容时删除元素,而不使用脏检查 这听起来很简单-只需从input.delegate处理程序中删除具有空值的元素,不幸的是,由于存在Aurelia,这不起作用。以下是尝试这种方法的要点: 我试图通过使用queueTask延迟删除数组元素来解决这个错误,但没有成功。由于开发人员关闭了这个bug,因为根据他们的说法,它是一个完全不相关问题的复制品,我想它不会很快得到修复 我不知道如何实施,所以欢迎提出任何建议 这里绝对不需要任何肮脏的检查!:)

我有一个绑定到输入元素的字符串数组:


我需要在删除输入内容时删除元素,而不使用脏检查

这听起来很简单-只需从input.delegate处理程序中删除具有空值的元素,不幸的是,由于存在Aurelia,这不起作用。以下是尝试这种方法的要点:

我试图通过使用queueTask延迟删除数组元素来解决这个错误,但没有成功。由于开发人员关闭了这个bug,因为根据他们的说法,它是一个完全不相关问题的复制品,我想它不会很快得到修复


我不知道如何实施,所以欢迎提出任何建议

这里绝对不需要任何肮脏的检查!:)

下面是一个适用于您的场景的工作演示:

  • 不再需要$parent了。它与1.0之前的Aurelia版本有关
  • 如果使用变量而不是数组索引,则可以利用输入提供的双向数据绑定

因此,您的onChange事件可以简化如下:

  • msg
    保存当前输入的实际值
  • i
    索引将用于删除
导出类应用程序{
消息=['Alpha'、'Bravo'、'Charlie'、'Delta'、'Echo'];
onMessageChanged(msg,i){
如果(!msg | | msg.length==0){
这个.信息.拼接(i,1);
}
}
}

有一个关于类似问题的相关问题。可能会向您提供有关主要思想的更多详细信息。

好的,因此解决此问题的方法不是使用buggy(在本例中)aurelia双向绑定,而是使用单向绑定并从input.delegate处理程序设置值:

@marton答案乍一看似乎有效,但实际上它禁用了双向绑定,因此对输入的任何更改都不会复制到数组中。但它给了我一个解决问题的重要提示。 此html代码的等效代码:


这是:

for(让消息的消息){
msg='something';//注意:这不会更改数组的内容
}
有关更多详细信息,请参阅

因此,这将强制单向绑定。要在@marton解决方案中解决此问题,我们只需更改input.delegate处理程序中的值:

onMessageChanged(msg,i){
如果(!msg | | msg.length==0){
this.messages.splice(i,1);//删除元素
}
否则{
this.messages[i]=msg;//更改值
}
}

您所说的“不使用脏检查”是什么意思?你怎么能确定这里正在进行肮脏的检查?目前这是否有效,而您只是想优化您的代码,还是根本不起作用?我尝试在不进行脏检查的情况下执行此操作(参见链接的要点),但由于Aurelia错误,它不起作用。脏检查将每100ms搜索一次阵列并删除任何空元素,它会起作用,但我想避免它。请参阅,或。另外,请查看新的。不幸的是,collectionObserver API仅在添加或删除元素时进行监视,而不是在更改元素时进行监视,请参阅以下要点:听起来很棒(也很有效!)。你怎么能确定没有进行脏的检查呢?Aurelia使用观察技术尽可能避免传统的脏的检查。在某些情况下,它会退回到脏检查,但这不适用于您的情况(简单的双向数据绑定)。大多数情况下,您可以依赖Aurelia的内置观察器,而无需实施自定义脏检查。更多信息:,thanx,我知道这一点,只是实际地问一下——它可以在浏览器中测试吗?e、 g.如果我创建了一个getter,而不使用
computedFrom
decoration,并将一个控制台日志放在其中,我可以看到脏检查机制调用。是否有其他方法来判断(证明)某个属性是否启用了脏检查?但这会禁用双向绑定,请参阅。实际上需要$parent.messages[i]来解决这个问题,尽管messages[$index]也可以。在要点中onMessageChanged的末尾放一个console.log(this.messages),注意元素实际上没有改变:但这给了我一个想法——为了解决这个bug,不要使用双向绑定,而是更改onMessageChanged的值,这样做是有效的:@EliranMalka:Well,您可以分析应用程序并查看调用堆栈以确保它。除此之外,Rob Eisenberg还谈到了数据绑定。更新
@computedFrom
脏检查:也可以通过使用
@observables
装饰器来避免:如果aurelia-2-way绑定实现了预期的功能,为什么您认为它有缺陷?在本问题中解释的情况下,它有缺陷。似乎对视图模型应用了两次单个输入值更改—在调用input.delegate处理程序之前和之后。这是处理程序从数组中删除元素时出现的问题。因为数组已经改变了-第二次Aurelia覆盖了一个不相关的元素。关于一个简单的例子,请参见本要点:这在与此问题相关的bug中得到了解释。@AngelPopov:我向您展示了一个处理删除的方法,我认为这就是上述问题的范围。:)虽然,我假设你想做得更多,这就是为什么我向你指出另一个相关的答案。一方面,使用
msg
reference会失去隐式数组更新的优势。但另一方面,Aurelia为您提供了足够的上下文信息(例如$index),以便在输入值更改时手动更新
消息
。使用$index与循环删除的结果相同,$index更有效。双向数组绑定令人困惑,您在这个陷阱中失败了,您说解决方案利用了双向绑定,但事实并非如此,这会让人们感到困惑-他们会使用它而不使用它