親で呼び出すコンポーネントを作成しましたが、キーパス関数を介してコンポーネントの値を取得しようとすると、値が空になります。コンポーネントのテンプレートでこのキーパスを直接呼び出さない限り、親にまだ存在していても存在しないようです。これを説明するための以下の例。
1 に答える
何が起こっているかというと、それthis
はコンポーネントです:
<p>Date: {{ startTime(this) }}</p>
は、チケット コンポーネントのコンテキストではなく、チケット コンポーネントのデフォルト コンテキストを参照します (コンポーネントは独自のデータ コンテンツを取得します)。
ただし、コンポーネントは、そのコンテキストでは見つからないプロパティを親のコンテキストで探します (isolated: true
コンポーネントに が設定されている場合を除き、その場合はそのコンテキストを離れません)。これらのプロパティを見つけると、独自のコンテキストでそれらを「借用」し (すべてを同期させます)、{{JSON.stringify(.)}}
チケット コンポーネントに追加することで確認できます。
> Object {title: "1st Release", price: "10.00", startTime: function}
したがって、簡単な修正の 1 つは、sale_start
プロパティをコンポーネントで直接使用することです。
<p>Date: {{ startTime(sale_start) }}</p>
または、必要に応じて、関数内のデータにアクセスできます。
startTime: function () {
return this.get('sale_start');
}
プロパティを渡す、またはget
構文を使用する利点は、プロパティの自動更新を取得できることです。コンテキストthis
を渡して呼び出しても、値が変更this.sale_start
された場合に自動更新は行われません。sale_start
計算されたプロパティを使用する場合:
computed: {
startTime: 'humaneDate(${sale_start})'
}
関数の代わりにプロパティとしてテンプレートで参照できます。
<p>Date: {{ startTime }}</p>
もう 1 つのオプションは、チケット データ オブジェクト全体をパラメーターとして明示的に宣言することで、コンポーネント コンテキストに取り込むことです。
<ticket ticket="{{.}}"/>
これは、いくつかのプロパティを書式設定して表示するよりも、コンポーネント内のオブジェクトを頻繁に操作する必要がある場合に有利です。この変更によりticket
、チケット コンポーネントのデータ コンテキストにプロパティが作成されるため、チケットのブロックを作成すると便利です。
{{#ticket}}
<div class="ticket">
<p>Title: {{ title }}</p>
<p>Price: {{ price }}</p>
<p>Date: {{ startTime(.) }}</p>
</div>
{{/}}
使用するだけでも問題なく動作しますが ( startTime 関数でsale_start
orを使用すると仮定すると:ticket.sale_start
<div class="ticket">
<p>Title: {{ title }}</p>
<p>Price: {{ price }}</p>
<p>Date: {{ startTime(sale_start) }}</p>
</div>