Подтвердить что ты не робот

Пользовательский элемент Aurelia + Select2, не распространяющий выбранные изменения

Я создал пользовательский элемент в Aurelia.

import {bindable, inject, customElement, bindingMode} from 'aurelia-framework';
import 'select2';
import * as $ from 'jquery';
import {BindingSignaler} from "aurelia-templating-resources";

@customElement('select2')
@inject(Element, BindingSignaler)
export class Select2CustomMultiselect {
    @bindable name = null;    // name/id of custom select
    @bindable selected = null;  // default selected values
    @bindable ({defaultBindingMode: bindingMode.oneWay, attribute:"options"}) source:Array<{id:number, name:any}>= [];   // array of options with id/name properties
    @bindable placeholder = "";
    @bindable allow_clear = true;
    private $select2: $;

    constructor(private element, private signaler:BindingSignaler) {
    }

    attached() {
        let $select = $(this.element).find('select');
        this.$select2 = $select.select2({theme: 'bootstrap', placeholder: this.placeholder});

        // on any change, propagate it to underlying select to trigger two-way bind
        this.$select2.on('change', (event) => {
            if (event.originalEvent) { return; }

            const select2Value = this.$select2.val();
            if(select2Value == this.selected) { return; }

            // dispatch to raw select within the custom element
            var notice = new Event('change', {bubbles: true});
            event.target.dispatchEvent(notice);
        });

        this.$select2.val(this.selected);//.trigger('change');
    }

    selectedChanged(newValue,oldValue){
        console.log(newValue);
    }

    detached() {
        $(this.element).find('select').select2('destroy');
    }
}

И это шаблон:

<template>
    <select value.two-way="selected" name.one-way="name" id.one-way="name" class="form-control"  data-allow-clear.one-way="allow_clear" size="1">
        <option></option>
        <option repeat.for="src of source" model.bind="src.id">${src.name & t}</option>
    </select>
</template>

Я использую элемент управления следующим образом:

<select2 name="payingBy" selected.two-way="model.countryId & validate" options.bind="countries" placeholder="${'Select' & t}" allow_clear="true"></select2>

И модель:

countries:Array<{id:number, name:string}> = [{id:1, name:"USA"}, {id:2, name:Canada'}];
model.countryId: number;

Теперь все работает нормально, если я изменил выбор и начальную привязку. Но если я изменю model.countryId от ie. 1 - 2, изменение не отражается в элементе управления выбора, управление по-прежнему отображает "США", как показано на рисунке 1. Поскольку свойство "selected" является связыванием двухсторонним, я бы ожидал, что он изменит выбор при его изменении. Но это не так. Зачем? Что я делаю неправильно?

Пожалуйста, помогите

4b9b3361

Ответ 1

Хорошо, я применил его как в этом сообщении: Custom Select2 Aurelia component

И он отлично работает.

Ответ 2

Это потому, что вы используете версию data, которая ожидает объект, но вы установили, что ваш выбор работает только с значением id. Поэтому вы должны использовать val для передачи идентификатора.

selectedChanged(newValue, oldValue) {
    console.log(newValue);
    if (this.select2) {
      this.select2.select2({
        val: newValue, // << changed this from data: newValue
        theme: 'bootstrap',
        placeholder: this.placeholder
      });
    }