| Index: third_party/pkg/angular/lib/directive/input_select.dart
|
| diff --git a/third_party/pkg/angular/lib/directive/ng_model_select.dart b/third_party/pkg/angular/lib/directive/input_select.dart
|
| similarity index 71%
|
| rename from third_party/pkg/angular/lib/directive/ng_model_select.dart
|
| rename to third_party/pkg/angular/lib/directive/input_select.dart
|
| index 1e8e6e047bdf0c76db13d791a7e7bc92a0bc83b5..af568b30aaac49e0f0a293782c74ca4ac4c8c0f1 100644
|
| --- a/third_party/pkg/angular/lib/directive/ng_model_select.dart
|
| +++ b/third_party/pkg/angular/lib/directive/input_select.dart
|
| @@ -1,10 +1,12 @@
|
| part of angular.directive;
|
|
|
| +typedef dynamic ItemEval(dynamic item, num index);
|
| +
|
| /**
|
| * HTML [SELECT] element with angular data-binding if used with
|
| - * [NgModel].
|
| + * [NgModelDirective].
|
| *
|
| - * The [NgModel] will receive the currently selected item. The binding
|
| + * The [NgModelDirective] will receive the currently selected item. The binding
|
| * is performed on the [OPTION].[value] property. An empty [OPTION].[value] is
|
| * treated as null.
|
| *
|
| @@ -12,15 +14,17 @@ part of angular.directive;
|
| * unknown [OPTION] is inserted into the list. Once the model points to an
|
| * existing [OPTION] the unknown [OPTION] is removed.
|
| *
|
| - * Because [OPTION].[value] attribute is a string, the model is bound to a
|
| - * string. If there is need to bind to an object then [OptionValue]
|
| + * Becouse [OPTION].[value] attribute is a string, the model is bound to a
|
| + * string. If there is need to bind to an object then [OptionValueDirective]
|
| * should be used.
|
| *
|
| */
|
| -@Decorator(
|
| - selector: 'select[ng-model]')
|
| -class InputSelect implements AttachAware {
|
| - final expando = new Expando<OptionValue>();
|
| +@NgDirective(
|
| + selector: 'select[ng-model]',
|
| + visibility: NgDirective.CHILDREN_VISIBILITY)
|
| +class InputSelectDirective implements NgAttachAware {
|
| + final Expando<OptionValueDirective> expando =
|
| + new Expando<OptionValueDirective>();
|
| final dom.SelectElement _selectElement;
|
| final NodeAttrs _attrs;
|
| final NgModel _model;
|
| @@ -32,11 +36,15 @@ class InputSelect implements AttachAware {
|
| _SelectMode _mode = new _SelectMode(null, null, null);
|
| bool _dirty = false;
|
|
|
| - InputSelect(dom.Element this._selectElement, this._attrs, this._model,
|
| - this._scope) {
|
| + InputSelectDirective(dom.Element this._selectElement, this._attrs, this._model,
|
| + this._scope) {
|
| _unknownOption.value = '?';
|
| - _nullOption = _selectElement.querySelectorAll('option')
|
| - .firstWhere((o) => o.value == '', orElse: () => null);
|
| + _unknownOption.text = ''; // Explicit due to dartbug.com/14407
|
| + _selectElement.querySelectorAll('option').forEach((o) {
|
| + if (_nullOption == null && o.value == '') {
|
| + _nullOption = o;
|
| + }
|
| + });
|
| }
|
|
|
| attach() {
|
| @@ -44,8 +52,7 @@ class InputSelect implements AttachAware {
|
| _mode.destroy();
|
| if (value == null) {
|
| _model.watchCollection = false;
|
| - _mode = new _SingleSelectMode(expando, _selectElement, _model,
|
| - _nullOption, _unknownOption);
|
| + _mode = new _SingleSelectMode(expando, _selectElement, _model, _nullOption, _unknownOption);
|
| } else {
|
| _model.watchCollection = true;
|
| _mode = new _MultipleSelectionMode(expando, _selectElement, _model);
|
| @@ -72,7 +79,7 @@ class InputSelect implements AttachAware {
|
| if (!_dirty) {
|
| _dirty = true;
|
| // TODO(misko): this hack need to delay the rendering until after domRead
|
| - // because the modelChange reads from the DOM. We should be able to render
|
| + // becouse the modelChange reads from the DOM. We should be able to render
|
| // without DOM changes.
|
| _scope.rootScope.domRead(() {
|
| _scope.rootScope.domWrite(() {
|
| @@ -89,22 +96,25 @@ class InputSelect implements AttachAware {
|
| * provides [ng-value] which allows binding to any expression.
|
| *
|
| */
|
| -@Decorator(selector: 'option', module: NgValue.moduleFactory)
|
| -class OptionValue implements AttachAware,
|
| - DetachAware {
|
| - final InputSelect _inputSelectDirective;
|
| +@NgDirective(
|
| + selector: 'option')
|
| +class OptionValueDirective implements NgAttachAware,
|
| + NgDetachAware {
|
| + final InputSelectDirective _inputSelectDirective;
|
| final dom.Element _element;
|
|
|
| NgValue _ngValue;
|
|
|
| - OptionValue(this._element, this._inputSelectDirective, this._ngValue) {
|
| + OptionValueDirective(this._element, this._inputSelectDirective, this._ngValue) {
|
| if (_inputSelectDirective != null) {
|
| _inputSelectDirective.expando[_element] = this;
|
| }
|
| }
|
|
|
| attach() {
|
| - if (_inputSelectDirective != null) _inputSelectDirective.dirty();
|
| + if (_inputSelectDirective != null) {
|
| + _inputSelectDirective.dirty();
|
| + }
|
| }
|
|
|
| detach() {
|
| @@ -114,11 +124,11 @@ class OptionValue implements AttachAware,
|
| }
|
| }
|
|
|
| - get ngValue => _ngValue.value;
|
| + get ngValue => _ngValue.readValue(_element);
|
| }
|
|
|
| class _SelectMode {
|
| - final Expando<OptionValue> expando;
|
| + final Expando<OptionValueDirective> expando;
|
| final dom.SelectElement select;
|
| final NgModel model;
|
|
|
| @@ -144,21 +154,19 @@ class _SingleSelectMode extends _SelectMode {
|
|
|
| bool _unknownOptionActive = false;
|
|
|
| - _SingleSelectMode(Expando<OptionValue> expando,
|
| + _SingleSelectMode(Expando<OptionValueDirective> expando,
|
| dom.SelectElement select,
|
| NgModel model,
|
| this._nullOption,
|
| - this._unknownOption)
|
| - : super(expando, select, model) {
|
| + this._unknownOption
|
| + ): super(expando, select, model) {
|
| }
|
|
|
| onViewChange(event) {
|
| var i = 0;
|
| model.viewValue = _forEachOption((option, _) {
|
| if (option.selected) {
|
| - if (option == _nullOption) return null;
|
| - assert(expando[option] != null);
|
| - return expando[option].ngValue;
|
| + return option == _nullOption ? null : expando[option].ngValue;
|
| }
|
| if (option != _unknownOption && option != _nullOption) i++;
|
| }, true);
|
| @@ -172,10 +180,8 @@ class _SingleSelectMode extends _SelectMode {
|
| if (value == null) {
|
| selected = option == _nullOption;
|
| } else {
|
| - OptionValue optionValueDirective = expando[option];
|
| - selected = optionValueDirective == null ?
|
| - false :
|
| - optionValueDirective.ngValue == value;
|
| + OptionValueDirective optionValueDirective = expando[option];
|
| + selected = optionValueDirective == null ? false : optionValueDirective.ngValue == value;
|
| }
|
| found = found || selected;
|
| option.selected = selected;
|
| @@ -197,7 +203,7 @@ class _SingleSelectMode extends _SelectMode {
|
| }
|
|
|
| class _MultipleSelectionMode extends _SelectMode {
|
| - _MultipleSelectionMode(Expando<OptionValue> expando,
|
| + _MultipleSelectionMode(Expando<OptionValueDirective> expando,
|
| dom.SelectElement select,
|
| NgModel model)
|
| : super(expando, select, model);
|
| @@ -217,9 +223,11 @@ class _MultipleSelectionMode extends _SelectMode {
|
| if (selectedValues is List) {
|
| fn = (o, i) {
|
| var selected = expando[o];
|
| - return selected == null ?
|
| - false :
|
| - o.selected = selectedValues.contains(selected.ngValue);
|
| + if (selected == null) {
|
| + return false;
|
| + } else {
|
| + return o.selected = selectedValues.contains(selected.ngValue);
|
| + }
|
| };
|
| }
|
|
|
|
|