javascript - 修改 observableArray 不会立即更新选择 UI
问题描述
我有一个多选下拉菜单。如果用户选择该选项all
,我希望取消选择所有其他选项,只选择all
。我几乎可以正常工作,但我的问题是在select
最小化下拉列表之前不会显示更新的值。的状态observableArray
似乎是正确的。
这是HTML:
<select data-bind="options: games, selectedOptions: selectedGame, optionsText: 'name', optionsValue: 'id'" multiple="true"></select>
和javascript:
this.games= [
{
name: 'All',
id: 'all'
},
{
name: 'Game1',
id: 'game1'
},
{
name: 'Game2',
id: 'game2'
},
]
this.selectedGame = ko.observableArray(['all']);
this.selectedGameBeforeChange = ko.observableArray([]);
this.selectedGame.subscribe((oldValue) =>
{
this.selectedGameBeforeChange(oldValue);
}, null, 'beforeChange');
this.selectedGame.subscribe((newValue) =>
{
const newValueAdded = newValue.filter(x => !this.selectedGameBeforeChange().includes(x));
if (newValueAdded.length > 0 && newValueAdded[0] === 'all'){
this.selectedGame.removeAll();
this.selectedGame.push('allCombined');
}
this.updateTable();
});
上面的代码有效,但是只有在我“最小化”选择并重新打开它后,更改才会反映在 UI 中。有没有办法强制 UI 在我observableArray
的更新后立即更新?
解决方案
你有 2 个错误:
- 而不是
push('allCombined')
,它应该是push('all')
。 - 它在
all
最后选择时有效,但在作为第一个选项时无效。为了解决这个问题,我们需要稍微修改一下条件。
这是最终代码(还有一些小的修改,例如使用self
代替this
):
var vm = function () {
var self = this;
self.games = [
{ name: 'All', id: 'all' },
{ name: 'Game1', id: 'game1' },
{ name: 'Game2', id: 'game2' }
];
self.selectedGames = ko.observableArray(['all']);
self.selectedGamesBeforeChange = ko.observableArray([]);
self.selectedGames.subscribe((oldValue) =>
{
self.selectedGamesBeforeChange(oldValue);
}, null, 'beforeChange');
self.selectedGames.subscribe((newValue) =>
{
if (newValue.length > 1 &&
newValue.includes('all')){
self.selectedGames.removeAll();
self.selectedGamesBeforeChange.removeAll();
self.selectedGames.push('all');
}
});
};
ko.applyBindings(new vm());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<select data-bind="options: games, selectedOptions: selectedGames, optionsText: 'name', optionsValue: 'id'" multiple="true"></select>
推荐阅读
- android - ScrollView 不滚动 android 中存在的所有项目
- python - 如何在python中有效地制作大稀疏矩阵?
- r - 为什么闪亮的应用程序可以在本地运行,但不能在服务器上运行?
- laravel - laravel 查询中的 if 条件
- c# - 动态添加 linq where 语句
- javascript - 按 Enter 按钮并过滤数据
- ios - SiriKit:自定义意图 - 本地化问题
- c++ - 如何使用库中的标头但不使用 CMake 链接到它?
- html - CSS Grid 样式按钮的 Chrome 问题
- amazon-web-services - 无法处理 AWS 标记