Aurelia привязывает JSON к массиву компонентов с сохранением свойств объекта по умолчанию

Я пытаюсь сделать следующее:

<my-component myobjarray.bind="[{a: 'ID'}, {b: 2}]"></my-component>

@customElement('my-component') 
export class MyComponent
{    
    @bindable myobjectarray: MyObject[] = [];
}

@inject(MyComponent)
@customElement('my-object') 
export class MyObject
{    
    constructor(component: MyComponent) {
    }
    @bindable a:string = 'Hello';
    @bindable b:number = 1;
}

Проблема заключается в том, что после связывания MyComponent.myobjectarray myobjectarray содержит следующие значения, потому что я только что отправил обычный объект JSON, но я хочу, чтобы он имел тип MyObject, фактически не определяя его как таковой при передаче его моему компоненту:

[0] a = "ID", b????
[1] a????, b = 2

Я хотел бы, чтобы он оживил объект на привязке, чтобы он имел значения по умолчанию и выглядел следующим образом: (На самом деле типы MyObject)

[0] a = "ID", b = 1 (default value)
[1] a = "Hello" (default value), b = 2

НЕОБЯЗАТЕЛЬНО было бы хорошо, если бы я сам сделал сопоставление в привязке или чем-то подобном, но я не могу создать новый экземпляр MyObject(this) в MyComponent, но ошибки Aurelia и не позволяют мне вводить MyComponent в MyObject. (Не уверен, как это сделать, но я хотел бы знать)

1 ответ

Я понял, как сделать это "по желанию" так, как я хотел, чтобы это было нелепой работой, чтобы получить что-то подобное. Было бы лучше, если бы bind мог просто автоматически добавлять подкомпоненты (без ввода их в шаблон), когда они не являются полными объектами JSON типа подкомпонента. Я все еще открыт для лучшего / правильного способа сделать это, но это мое текущее решение:

В MyComponent добавьте:

    constructor(private bindingEngine:BindingEngine, private viewCompiler:ViewCompiler, private viewSlot:ViewSlot, private container:Container, private resources:ViewResources){
    }

    myobjectarrayChanged(value) {        
        this.myobjectarray = [];
        var item:any;
        var sItems = '<template>';
        for(let item of value){
            sItems += `${'<my-object'}
                ${item.hasOwnProperty('a') ? ' a="' + item.a + '"' : ''}
                ${item.hasOwnProperty('b') ? ' b="' + item.b + '"' : ''}
                ${'></my-object>'}`;
        }
        sItems += '<template>';

        var viewFactory =  this.viewCompiler.compile(sItems, this.resources);
        var bindingContext = null; 
        var view = viewFactory.create(this.container, bindingContext);
        this.viewSlot.add(view);
        this.viewSlot.attached();
    }

И в MyObject добавьте это в конструктор:

component.myobjectarray.push(this);

Это позволяет вам указать ваш компонент, например:

<my-component myobjarray.bind="[{a: 'ID'}, {b: 2}]"></my-component>

ИЛИ ЖЕ

<my-component>
    <my-object a='ID'></my-object>
    <my-object b='2'></my-object>
</my-component>

Что я и пытался сделать.

Другие вопросы по тегам