Aurelia compose - 父不访问子元素 - 双向绑定不回溯到父级

时间:2018-01-28 11:23:33

标签: aurelia aurelia-binding

我有一个名为client.html的父级。

我有一个名为address.html的孩子。

我使用compose元素在父视图模型中显示子项:

<compose view-model="../address/address" model.bind="client.address"></compose>

client.address类型是AddressDetails(下面)。

客户端视图(address.ts)中的

我从父级访问数据 - &#34; client.Address&#34;使用激活功能:

activate(model: AddressDetails) {
    if (model) {
        this.address.deserialize(model);
    }
}

我也尝试过:

activate(model: AddressDetails) 
    this.address = model;
}
在address.ts中的

我在address.ts中设置我的绑定对象如下:

export class Address {
    address = new AddressDetails;
    ...

将地址对象设置为模型,因为这会将地址指针设置为模型。

..和我的addressDetails类(具有反序列化功能)是:

    export class AddressDetails implements Serializable<AddressDetails> {
        address1: string;
        address2: string;
        suburb: string;
        postcode: string;
        stateShortName: string;
        addressLocationId: number;

        deserialize(input) {
            console.log("INPUT: ", input)
            this.address1 = input.address1;
            this.address2 = input.address2;
            this.suburb = input.suburb;
            this.postcode = input.postcode;
            this.stateShortName = input.stateShortName;
            this.addressLocationId = input.addressLocationId;

            return this;
        }
    }

Address.html(子)的一部分在下面显示了Address1的绑定:

<input type="text" value.bind="address.address1" class="form-control" id="address1" placeholder="Address 1st line...">

因此,当我将client.address传递给compose元素时,它会工作,并且我将获得client.address已填充的所有字段显示在组合元素上。

所以数据会传递给孩子(address.html)

然而,当需要保存数据时,我没有双向绑定。对于那些将client.address传递给地址视图/ viewmodel的实例,在客户端(父级)上没有获取任何更改。它将数据传递下来但没有备份。

我已将模型设置为在子项中处理,但模型未在父项中更新。

如何在传递数据对象时进行合成,以便它以两种方式工作?

它是双向的吗?如果是这样,我做错了什么?

1 个答案:

答案 0 :(得分:0)

出于多种原因,Compose的设计并不像真正的自定义元素那样工作。您可以做的是将父对象传递给compose,然后与子对象的属性绑定:

<!-- parent template -->
<template>
  <compose model.bind="details"></compose>
</template>

<!-- child template -->
<template>
  Address:
  <input value.bind="details.address" />
  Postcode:
  <input value.bind="details.postcode" />
</template>