account
ハンドルバーテンプレートでのプロパティバインディングを定義できます。このバインディングは次のように機能します。
<script type="text/x-handlebars">
<h1>App</h1>
{{#each item in controller}}
{{#view App.AccountView accountBinding="item"}}
<a {{bindAttr href="view.account.url"}} target="_blank">
{{view.account.name}}
</a>
{{/view}}
{{/each}}
</script>
を追加accountBinding
したので、一般的なルールはpropertyName
とBinding
サフィックスとしてです。また、ビューにプロパティを追加すると、そのプロパティに直接アクセスできなくなり、代わりにview.propertyName
上記のようにアクセスする必要があることに注意してください。
ヘルパーView
を使用するときは、クラスが必要であることに注意してください。{{view}}
window.App = Em.Application.create();
App.AccountView = Em.View.extend(); // this must exist
App.ApplicationRoute = Em.Route.extend({
model: function() {
return [
{id: 1, name: 'Ember.js', url: 'http://emberjs.com'},
{id: 2, name: 'Toronto Ember.js', url: 'http://torontoemberjs.com'},
{id: 3, name: 'JS Fiddle', url: 'http://jsfiddle.com'}];
}
})
ワーキングフィドル: http: //jsfiddle.net/schawaska/PFxHx/
アップデート1への対応:
私は同じようなシナリオに陥り、{{linkTo}}
ヘルパーを模倣するための子ビューを作成することになりました。私はそれが最良の実装であるかどうかを本当に知りません/考えていません。あなたはここで私の以前のコードを見ることができます:http://jsfiddle.net/schawaska/SqhJB/
その時、私はApplicationView
:内に子ビューを作成していました。
App.ApplicationView = Em.View.extend({
templateName: 'application',
NavbarView: Em.View.extend({
init: function() {
this._super();
this.set('controller', this.get('parentView.controller').controllerFor('navbar'))
},
selectedRouteName: 'home',
gotoRoute: function(e) {
this.set('selectedRouteName', e.routeName);
this.get('controller.target.router').transitionTo(e.routePath);
},
templateName: 'navbar',
MenuItemView: Em.View.extend({
templateName:'menu-item',
tagName: 'li',
classNameBindings: 'IsActive:active'.w(),
IsActive: function() {
return this.get('item.routeName') === this.get('parentView.selectedRouteName');
}.property('item', 'parentView.selectedRouteName')
})
})
});
そして私のハンドルバーは次のようになります:
<script type="text/x-handlebars" data-template-name="menu-item">
<a {{action gotoRoute item on="click" target="view.parentView"}}>
{{item.displayText}}
</a>
</script>
<script type="text/x-handlebars" data-template-name="navbar">
<ul class="left">
{{#each item in controller}}
{{view view.MenuItemView itemBinding="item"}}
{{/each}}
</ul>
</script>
申し訳ありませんが、これ以上の回答はできません。これは私がその時に思いついたものであり、それ以来それに触れていません。私が言ったように、私はこれがそれを処理する方法ではないと思います。{{linkTo}}
ヘルパーのソースコードを調べてみると、独自の実装のベースとなる可能性のあるモジュール式でエレガントな実装が表示されます。私はあなたが探している部分はhref
次のように定義されているプロパティだと思います:
var LinkView = Em.View.extend({
...
attributeBindings: ['href', 'title'],
...
href: Ember.computed(function() {
var router = this.get('router');
return router.generate.apply(router, args(this, router));
})
...
});
だから、そこからあなたはそれがどのように機能するかを理解し、あなた自身で何かを実装することができると思います。それが役に立ったら教えてください。