Dropdown select (Dart Angular Components) 丢弃第二个 selection
Dropdown select (Dart Angular Components) discards the second selection
我有下面的例子class:
import 'package:angular/angular.dart';
import 'package:angular_forms/angular_forms.dart';
import 'package:angular_components/angular_components.dart'
show
SelectionModel,
HasUIDisplayName,
Selectable,
SelectableOption,
StringSelectionOptions,
MaterialDropdownSelectComponent,
MaterialSelectSearchboxComponent,
SelectionChangeRecord,
ItemRenderer,
CachingItemRenderer;
@Component(
selector: 'example-select',
templateUrl: 'example.html',
styleUrls: const [
'example.css'
],
directives: const [
CORE_DIRECTIVES,
formDirectives,
MaterialDropdownSelectComponent,
MaterialSelectSearchboxComponent,
])
class ExampleSelect {
int width = 0;
List<SelectElement> valuesList;
SelectionOptions<SelectElement> _elementListOptions;
StringSelectionOptions<SelectElement> get elementOptions =>
_elementListOptions;
ItemRenderer<SelectElement> get itemRenderer => _itemRenderer;
// Single Selection Model.
final SelectionModel<SelectElement> singleSelectModel =
new SelectionModel.withList(selectedValues: []);
// Label for the button for single selection.
String get singleSelectLabel => singleSelectModel.selectedValues.isNotEmpty
? itemRenderer(singleSelectModel.selectedValues.first)
: 'No Selection';
dynamic get singleSelectedValue => singleSelectModel.selectedValues.isNotEmpty
? singleSelectModel.selectedValues.first.value
: null;
ExampleSelect() {
singleSelectModel.selectionChanges.listen(updateModel);
valuesList = <SelectElement>[
new SelectElement(1, "First"),
new SelectElement(2, "Second"),
new SelectElement(3, 'Third')
];
_elementListOptions = new SelectionOptions<SelectElement>(valuesList);
}
void updateModel(List<SelectionChangeRecord> record) {
print(record);
}
static final ItemRenderer<SelectElement> _itemRenderer =
new CachingItemRenderer<SelectElement>(
(selectElement) => "$selectElement");
}
class SelectElement implements HasUIDisplayName {
final value;
final String label;
const SelectElement(this.value, this.label);
@override
String get uiDisplayName => label;
@override
bool operator ==(Object other) => other is SelectElement && label == label;
@override
int get hashCode => label.hashCode;
@override
String toString() => uiDisplayName;
}
class SelectionOptions<T> extends StringSelectionOptions<T>
implements Selectable {
SelectionOptions(List<T> options)
: super(options, toFilterableString: (T option) => option.toString());
@override
SelectableOption getSelectable(selectElement) =>
selectElement is SelectElement
? SelectableOption.Selectable
: SelectableOption.Disabled;
}
html如下:
<material-dropdown-select
[buttonText]="singleSelectLabel"
[selection]="singleSelectModel"
[options]="elementOptions"
[width]="width"
[itemRenderer]="itemRenderer">
</material-dropdown-select>
<br>
Selected: {{singleSelectLabel}}
现在,如果我 运行 这个例子,我 select 第一个元素,一切正常,但是当我 select "Second" 元素时,下拉列表return 不 selected.
这是由显示以下内容的打印函数恢复的:
[SelectionChangeRecord{added: [First], removed: []}]
[SelectionChangeRecord{added: [], removed: [First]}]
我做错了什么?
你的 equals 方法有一个错误:
@override
bool operator ==(Object other) => other is SelectElement && label == label;
看到了吗??
应该是
other.label == label
我可能建议不要重写 equals 方法,但这就是这里发生的情况。所以当你 select/unselect 小部件是 selecting/unselecting 一切,因为你说它们是平等的。
我有下面的例子class:
import 'package:angular/angular.dart';
import 'package:angular_forms/angular_forms.dart';
import 'package:angular_components/angular_components.dart'
show
SelectionModel,
HasUIDisplayName,
Selectable,
SelectableOption,
StringSelectionOptions,
MaterialDropdownSelectComponent,
MaterialSelectSearchboxComponent,
SelectionChangeRecord,
ItemRenderer,
CachingItemRenderer;
@Component(
selector: 'example-select',
templateUrl: 'example.html',
styleUrls: const [
'example.css'
],
directives: const [
CORE_DIRECTIVES,
formDirectives,
MaterialDropdownSelectComponent,
MaterialSelectSearchboxComponent,
])
class ExampleSelect {
int width = 0;
List<SelectElement> valuesList;
SelectionOptions<SelectElement> _elementListOptions;
StringSelectionOptions<SelectElement> get elementOptions =>
_elementListOptions;
ItemRenderer<SelectElement> get itemRenderer => _itemRenderer;
// Single Selection Model.
final SelectionModel<SelectElement> singleSelectModel =
new SelectionModel.withList(selectedValues: []);
// Label for the button for single selection.
String get singleSelectLabel => singleSelectModel.selectedValues.isNotEmpty
? itemRenderer(singleSelectModel.selectedValues.first)
: 'No Selection';
dynamic get singleSelectedValue => singleSelectModel.selectedValues.isNotEmpty
? singleSelectModel.selectedValues.first.value
: null;
ExampleSelect() {
singleSelectModel.selectionChanges.listen(updateModel);
valuesList = <SelectElement>[
new SelectElement(1, "First"),
new SelectElement(2, "Second"),
new SelectElement(3, 'Third')
];
_elementListOptions = new SelectionOptions<SelectElement>(valuesList);
}
void updateModel(List<SelectionChangeRecord> record) {
print(record);
}
static final ItemRenderer<SelectElement> _itemRenderer =
new CachingItemRenderer<SelectElement>(
(selectElement) => "$selectElement");
}
class SelectElement implements HasUIDisplayName {
final value;
final String label;
const SelectElement(this.value, this.label);
@override
String get uiDisplayName => label;
@override
bool operator ==(Object other) => other is SelectElement && label == label;
@override
int get hashCode => label.hashCode;
@override
String toString() => uiDisplayName;
}
class SelectionOptions<T> extends StringSelectionOptions<T>
implements Selectable {
SelectionOptions(List<T> options)
: super(options, toFilterableString: (T option) => option.toString());
@override
SelectableOption getSelectable(selectElement) =>
selectElement is SelectElement
? SelectableOption.Selectable
: SelectableOption.Disabled;
}
html如下:
<material-dropdown-select
[buttonText]="singleSelectLabel"
[selection]="singleSelectModel"
[options]="elementOptions"
[width]="width"
[itemRenderer]="itemRenderer">
</material-dropdown-select>
<br>
Selected: {{singleSelectLabel}}
现在,如果我 运行 这个例子,我 select 第一个元素,一切正常,但是当我 select "Second" 元素时,下拉列表return 不 selected.
这是由显示以下内容的打印函数恢复的:
[SelectionChangeRecord{added: [First], removed: []}]
[SelectionChangeRecord{added: [], removed: [First]}]
我做错了什么?
你的 equals 方法有一个错误:
@override
bool operator ==(Object other) => other is SelectElement && label == label;
看到了吗??
应该是
other.label == label
我可能建议不要重写 equals 方法,但这就是这里发生的情况。所以当你 select/unselect 小部件是 selecting/unselecting 一切,因为你说它们是平等的。