2017-07-21 9 views
1

Aureliaでカスタム要素を作成する場合、バインドされていない余分な属性をすべて取り、テンプレート内の特定の要素にコピーする方法がありますか?たとえば、 "name"というバインド可能なプロパティを持つ "my-custom-element"というカスタム要素を作成します。カスタム要素のすべての属性をAureliaのテンプレートにコピー

<my-custom-element name="MyName" class="my-class" data-id="1" /> 

私のテンプレートには、次のようになります。私は、レンダリングしているしたいと思い何

<template> 
    <input name.bind="name" type="text" /> 
</template> 

は次のとおりです。

<input name="MyName" class="my-class" data-id="1" /> 

だから、他の言葉で、私は任意の追加属性(複数可)を希望Aureliaによって入れられていないか、私のテンプレートの要素に追加できるプロパティにバインドされていません。クラスのためにバインド可能なプロパティを追加することができます。これはかなり一般的です。「データ」属性のようなものは何でもかまいません。

コンテナレスのカスタム要素をサポートできるかどうかを確認したいと思います。

答えて

0

これは単なるHTMLなので、カスタム要素のVMに要素自体を挿入し、次にinput要素を参照することができます。次に、普通の古いDOMメソッドを使ってカスタム要素を調べます。それはおそらく少し脆いだろうが、以下のようなものは動作するはずです:

import {inject, customElement, bindable} from 'aurelia-framework'; 

@customElement('my-custom-element') 
@inject(Element) 
export class MyCustomElement { 
    @bindable name; 

    constructor(el) { 
    this.el = el; 
    } 

    attached() { 
    const attributes = this.el.attributes; 

    for(const attr of attributes) { 
     let {name, value} = attr; 

     if(name != 'au-target-id') { 
     const dotLocation = name.indexOf('.'); 

     if(dotLocation > -1) { 
      name = name.substring(0, dotLocation); 
     } 

     if(name !== 'name') { 
      this.myInput.setAttribute(name,value); 
     } 
     } 
    } 
    } 
} 

私は実行可能要旨hereを作成しました。

+0

ありがとうございます!これはかなり近いです。私が容器なしにすると、もはや機能しません。コンテナレスカスタム要素をサポートする方法はありますか? –

+0

私はそれを疑っていますが、正直言って私は人々がコンテナレスを濫用していると思います。絶対に必要な場合にのみ使用してください。 –

+0

さて、あなたが言っていることが分かります。私が尋ねる理由は、同じ属性がルート要素に存在するからです。特定の属性を探すjavascriptやCSSを書く人は、特定のテンプレート要素を指定する必要があります。だから私が与えた例では、それはCSSクラスを持っています。 .my-classのスタイルを追加するだけで、そのスタイルを両方の要素に関連付けます。 –

関連する問題