Aurelia のカスタム要素機能をいじって、「プログレス バー」要素を作成しようとしました。
プログレスバー.js
import {customElement, bindable} from 'aurelia-framework';
@customElement('progress-bar')
export class ProgressBar
{
//do stuff//
}
プログレスバー.html
<template>
<link rel="stylesheet" type="text/css" href="src/components/progress-bar.css">
<div class='progress-bar' tabindex=0 ref="bar">bloo</div>
</template>
test.html(該当部分)
<require from="./components/progress-bar"></require>
<progress-bar ref="pb">a</progress-bar>
これはすべて正常に表示されます。しかし、メインページで関数を呼び出したり、要素の属性を変更したりできるようにする方法に苦労しています。これにより、プログレスバー自体で何かを行う必要があります。
progress-bar.js 内に関数「doSomething」を作成しようとしましたが、test.js でアクセスできません。
progress-bar.js に追加
doSomething(percent, value) {
$(this.bar).animate('width: ${percent}%', speed);
}
test.js内
clicked() {
console.log(this.pb); // this returns the progress bar element fine
console.log(this.pb.doSomething); //this returns as undefined
this.pb.doSomething(percent, value); // this fails outright with error: typeError - doSomething is not a function
}
次に、progress-bar 要素内にカスタム属性を設定しようとしましたが、代わりに valueChange を使用して div を変更しました。
progress-bar.js の内部
@bindable percent=null;
@bindable speed=null;
test.js
clicked() {
this.pb.percent=50; //this updated fine
this.pb.speed=1500; //this updated fine
}
そこには問題ありません、ほとんどそこにあります。しかし、属性が変更されたときに呼び出すハンドラーを設定するにはどうすればよいでしょうか?
この構文を持つチュートリアルを見つけました:
@bindable({
name:'myProperty', //name of the property on the class
attribute:'my-property', //name of the attribute in HTML
changeHandler:'myPropertyChanged', //name of the method to invoke on property changes
defaultBindingMode: ONE_WAY, //default binding mode used with the .bind command
defaultValue: undefined //default value of the property, if not bound or set in HTML
})
しかし、progress-bar.js でそのコードを使用できないようです。追加した後、ページが正しくレンダリングされません。Gulp はエラー メッセージを返していないようですが、ブラウザー コンソールは次のエラーを返します。
ERROR [app-router] Router navigation failed, and no previous location could be restored.
これは、ページのどこかに構文エラーがある場合に通常受け取るメッセージです。
ここでわからないことがたくさんあります:
これはカスタム要素の正しい使い方ですか? 内部に関数を含むカスタム要素を作成できますか? 値が変更されたときにイベントをトリガーできるカスタム属性を持つカスタム要素を作成できますか?
さまざまなことを試しているときに非常に多くのバリエーションがあるため、コード全体を掲載していないことをお詫びします。