99% の場合、必要なのはテンプレートだけであることがわかりました。ビューは、テンプレートを操作する必要がある場合や、再利用したい UI がある場合に使用します。例として、アプリ内のいくつかの異なる場所で使用する必要がある複雑なユーザー操作を行うツリービューのビュー コンポーネントを作成しました。また、ビューを使用して、ブラウザーのスクロール アクションをビュー内のメソッドにバインドするテンプレート内のデータで「無限」スクロールを処理しました。これにより、コントローラーのメソッドがトリガーされ、Web ページが一番下までスクロールされたときに、より多くの結果が取得されます。
App.CompoundPathwaysIndexView = Ember.View.extend({
didInsertElement: function() {
var view = this;
$(window).bind("scroll", function() {
view.didScroll();
});
},
willDestroyElement: function() {
$(window).unbind("scroll");
},
didScroll: function() {
if(this.isScrolledToBottom() && !this.get('controller').get('fetching')) {
this.get('controller').set('fetching', true);
this.get('controller').send('fetchMore');
}
},
isScrolledToBottom: function() {
var documentHeight = $(document).height();
var windowHeight = $(window).height();
var top = $(document).scrollTop();
var scrollPercent = (top/(documentHeight-windowHeight)) * 100;
return scrollPercent > 99;
}
});
ビューの他の例は、テンプレートが didInsertElement メソッドを使用してレンダリングされた後にスクリプト タグをテンプレートに挿入することです (これらをハンドルバー テンプレートに追加することは明らかに悪い習慣であるため) 。
たとえば、テキスト ボックスでブートストラップの先行入力機能を有効にすると、次のようになります。
テンプレート:
{{input type="text" placeholder="search" value=search action="query" id="search_box" class="search-query span4"}}
景色:
App.ApplicationView = Ember.View.extend({
didInsertElement: function() {
$('#search_box').typeahead({
source: function (query, process) {
$.getJSON(typeaheadUrl, { query: query }, function (data) {
return process(data);
})
}
});
}
});