如何解决从ObservableList <int>添加或删除元素时未触发反应
use warnings;
use strict;
my @array = (0,undef,3);
if (grep {! defined} @array) {
print "undefined values in array\n";
}
我遇到的一个问题是class QuestionnaireMultiselectCheckBoxWrapperStore = _QuestionnaireMultiselectCheckBoxWrapperStore
with _$QuestionnaireMultiselectCheckBoxWrapperStore;
abstract class _QuestionnaireMultiselectCheckBoxWrapperStore with Store {
final QuestionRes questionData;
final QuestionObservable questionStore;
Reactiondisposer _validationdisposer;
_QuestionnaireMultiselectCheckBoxWrapperStore(
{this.questionData,this.questionStore}) {
answerIds =
questionStore.answerIds.map((e) => e.id).toList().asObservable();
_validationdisposer = reaction((_) => answerIds,validateAnswerIds);
}
void dispose() => _validationdisposer?.reaction?.dispose();
//-----
@observable
ObservableList<int> answerIds;
@action
void setAnswerId(int id,bool remove) {
if (remove)
answerIds.removeWhere((e) => e == id);
else
answerIds.add(id);
questionStore.setAnswerId(id,remove);
}
@observable
String errorText;
@action
void validateAnswerIds(ObservableList<int> answers) {
if (answers.isEmpty && questionData.isMandatory) {
errorText = "ANSWER_required_ERROR";
} else
errorText = null;
}
}
所做的更改后未触发validateAnswerIds
可以通过将validateAnswerIds
函数更改为以下内容来解决此问题:
setAnswerId
因此基本上是通过放弃ObservableList的主要功能来实现的,该功能主要是对元素的操作做出反应,从而有利于更改对对象的引用。可以在常规 @action
void setAnswerId(int id,bool remove) {
var tmpList = List<int>();
tmpList.addAll(answerIds);
if (remove) {
tmpList.removeWhere((e) => e == id);
} else {
tmpList.add(id);
}
answerIds = tmpList;
questionStore.setAnswerId(id,remove);
}
上完成。这使List
毫无用处,因此肯定有一个我几乎没有错过的收获。
在列表中添加项目,删除项目或在某个索引处修改项目时,列表不会通知MobX。要获得反应性行为,必须使用ObservableList。
那么我的代码中是否有错误,或者ObservableList
的使用意图与我不同?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。