UNPKG

angular2

Version:

Angular 2 - a web framework for modern web apps

139 lines (138 loc) 5.67 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; import { Directive, Renderer, forwardRef, Provider, ElementRef, Input, Host, Optional } from 'angular2/core'; import { NG_VALUE_ACCESSOR } from './control_value_accessor'; import { CONST_EXPR, StringWrapper, isPrimitive, isPresent, isBlank, looseIdentical } from 'angular2/src/facade/lang'; import { MapWrapper } from 'angular2/src/facade/collection'; const SELECT_VALUE_ACCESSOR = CONST_EXPR(new Provider(NG_VALUE_ACCESSOR, { useExisting: forwardRef(() => SelectControlValueAccessor), multi: true })); function _buildValueString(id, value) { if (isBlank(id)) return `${value}`; if (!isPrimitive(value)) value = "Object"; return StringWrapper.slice(`${id}: ${value}`, 0, 50); } function _extractId(valueString) { return valueString.split(":")[0]; } /** * The accessor for writing a value and listening to changes on a select element. * * Note: We have to listen to the 'change' event because 'input' events aren't fired * for selects in Firefox and IE: * https://bugzilla.mozilla.org/show_bug.cgi?id=1024350 * https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/4660045/ * */ export let SelectControlValueAccessor = class SelectControlValueAccessor { constructor(_renderer, _elementRef) { this._renderer = _renderer; this._elementRef = _elementRef; /** @internal */ this._optionMap = new Map(); /** @internal */ this._idCounter = 0; this.onChange = (_) => { }; this.onTouched = () => { }; } writeValue(value) { this.value = value; var valueString = _buildValueString(this._getOptionId(value), value); this._renderer.setElementProperty(this._elementRef.nativeElement, 'value', valueString); } registerOnChange(fn) { this.onChange = (valueString) => { fn(this._getOptionValue(valueString)); }; } registerOnTouched(fn) { this.onTouched = fn; } /** @internal */ _registerOption() { return (this._idCounter++).toString(); } /** @internal */ _getOptionId(value) { for (let id of MapWrapper.keys(this._optionMap)) { if (looseIdentical(this._optionMap.get(id), value)) return id; } return null; } /** @internal */ _getOptionValue(valueString) { let value = this._optionMap.get(_extractId(valueString)); return isPresent(value) ? value : valueString; } }; SelectControlValueAccessor = __decorate([ Directive({ selector: 'select[ngControl],select[ngFormControl],select[ngModel]', host: { '(change)': 'onChange($event.target.value)', '(blur)': 'onTouched()' }, providers: [SELECT_VALUE_ACCESSOR] }), __metadata('design:paramtypes', [Renderer, ElementRef]) ], SelectControlValueAccessor); /** * Marks `<option>` as dynamic, so Angular can be notified when options change. * * ### Example * * ``` * <select ngControl="city"> * <option *ngFor="let c of cities" [value]="c"></option> * </select> * ``` */ export let NgSelectOption = class NgSelectOption { constructor(_element, _renderer, _select) { this._element = _element; this._renderer = _renderer; this._select = _select; if (isPresent(this._select)) this.id = this._select._registerOption(); } set ngValue(value) { if (this._select == null) return; this._select._optionMap.set(this.id, value); this._setElementValue(_buildValueString(this.id, value)); this._select.writeValue(this._select.value); } set value(value) { this._setElementValue(value); if (isPresent(this._select)) this._select.writeValue(this._select.value); } /** @internal */ _setElementValue(value) { this._renderer.setElementProperty(this._element.nativeElement, 'value', value); } ngOnDestroy() { if (isPresent(this._select)) { this._select._optionMap.delete(this.id); this._select.writeValue(this._select.value); } } }; __decorate([ Input('ngValue'), __metadata('design:type', Object), __metadata('design:paramtypes', [Object]) ], NgSelectOption.prototype, "ngValue", null); __decorate([ Input('value'), __metadata('design:type', Object), __metadata('design:paramtypes', [Object]) ], NgSelectOption.prototype, "value", null); NgSelectOption = __decorate([ Directive({ selector: 'option' }), __param(2, Optional()), __param(2, Host()), __metadata('design:paramtypes', [ElementRef, Renderer, SelectControlValueAccessor]) ], NgSelectOption);