-
Notifications
You must be signed in to change notification settings - Fork 53
BridgeDev tutorials: 3. Select component
Daniel Bendel edited this page Feb 8, 2016
·
3 revisions
This wrapper encapsulates the Materialize select control, ensuring that it behaves as a standard Aurelia component. See how the Aurelia application uses this component here.
File select.js
import { customAttribute } from 'aurelia-templating';
import { ObserverLocator } from 'aurelia-binding';
import { inject } from 'aurelia-dependency-injection';
import * as LogManager from 'aurelia-logging';
import { fireEvent } from '../common/events';
@inject(Element, LogManager, ObserverLocator)
@customAttribute('md-select')
export class MdSelect {
_suspendUpdate = false;
constructor(element, logManager, observerLocator) {
this.element = element;
this.handleChangeFromViewModel = this.handleChangeFromViewModel.bind(this);
this.handleChangeFromNativeSelect = this.handleChangeFromNativeSelect.bind(this);
this.log = LogManager.getLogger('md-select');
this.observerLocator = observerLocator;
this.valueObserver = this.observerLocator.getObserver(this.element, 'value');
}
attached() {
this.valueObserver.subscribe(this.handleChangeFromViewModel);
$(this.element).material_select();
$(this.element).on('change', this.handleChangeFromNativeSelect);
}
detached() {
$(this.element).off('change', this.handleChangeFromNativeSelect);
$(this.element).material_select('destroy');
this.valueObserver.unsubscribe();
}
handleChangeFromNativeSelect() { this.element.value, $(this.element).val());
if (!this._suspendUpdate) {
this._suspendUpdate = true;
fireEvent(this.element, 'change');
this._suspendUpdate = false;
}
}
handleChangeFromViewModel(newValue) {
if (!this._suspendUpdate) {
$(this.element).material_select();
}
}
}
#### Next page: [Button component](#/help/docs/bridge_developers_tutorials/4._button_component)