EmberビューがDOMに挿入された後に関数を実行するにはどうすればよいですか?
これが私のユースケースです:ソートを可能にするためにjQuery UI sortableを使用したいと思います。
「ビューの要素がDOMに挿入されたときに呼び出されます。ドキュメント本体の要素を必要とする設定を行うには、この関数をオーバーライドしてください。」であるため、didInsertElement
をオーバーライドする必要があります。
didInsertElement
コールバック内では、this.$()
を使用して、ビューの要素のjQueryオブジェクトを取得できます。
リファレンス: https://github.com/emberjs/ember.js/blob/master/packages/ember-views/lib/views/view.js
AfterRenderメソッドも使用できます
didInsertElement: function () {
Ember.run.scheduleOnce('afterRender', this, function () {
//Put your code here what you want to do after render of a view
});
}
Ember 2.x:ビューは非推奨です。代わりにコンポーネントを使用してください
特定のことがいつ発生するかを知るには、コンポーネントのライフサイクルを理解する必要があります。
コンポーネントがレンダリング、再レンダリングされ、最終的に削除されると、Emberは、コンポーネントのライフの特定の時間にコードを実行できるようにするライフサイクルフックを提供します。
https://guides.emberjs.com/v2.6.0/components/the-component-lifecycle/
一般に、didInsertElement
はサードパーティのライブラリと統合するのに最適な場所です。
このフックは2つのことを保証します。
$()
メソッドを介してアクセスできます。属性が変更されるたびにJavaScriptを実行する必要があります
didRender
フック内でコードを実行します。
もう一度、詳細については上記のライフサイクルのドキュメントをお読みください
Ember 3.1 から始めて、Glimmerから継承するコンポーネントを使用できます。以下の例は、その例を示しています。
import Component from '@glimmer/component';
import { action } from '@ember/object';
/* global jQuery */
export default class MyOctaneComponent extends Component {
@action configureSorting(element) {
jQuery(element).sortable();
}
}
<div {{did-insert this.configureSorting}}>
<span>1</span>
<span>2</span>
<span>3</span>
</div>
これらのビュースタイルコンポーネントには直接ライフサイクルフックがありませんが、代わりに render-modifiers を使用して関数をアタッチできます。修飾子の非公式な紹介 ここにあります
これの利点は、テンプレートの責任が何であり、どのようになるかがより明確になることです。
これを試してみたい場合の実行可能なコードサンドボックスは次のとおりです。 https://codesandbox.io/s/octane-starter-ftt8s
ビューのdidInsertElement
コールバックで必要なものを起動する必要があります。
MyEmberApp.PostsIndexView = Ember.View.extend({
didInsertElement: function(){
// 'this' refers to the view's template element.
this.$('table.has-datatable').DataTable();
}
});