我有一个内置基本功能的应用。我没有经历并添加其他功能。在这种情况下,我需要将一个简单的按钮(当前使用linkTo
)转换为View。问题是我不确定如何将一个转换为另一个并仍保持链接完整。
如何进行此转换?这是我现在的代码:
<script type="text/x-handlebars" data-template-name="accountItem">
{{#each account in controller}}
{{#linkTo "account" account}}
<img {{bindAttr src="account.icon"}} />
{{/linkTo}}
{{/each}}
</script>
这是我将要拥有的代码:
<script type="text/x-handlebars" data-template-name="accountItem">
{{#each account in controller}}
{{#view "Social.AccountButtonView"}}
<img {{bindAttr src="account.icon"}} />
{{/view}}
{{/each}}
</script>
Social.AccountButtonView = Ember.View.extend({
tagName: 'a',
classNames: ['item-account'],
click: function(){
// do something
}
});
我认为我将构建在View中的click处理程序之上,但我不确定如何将引用传递给迭代的项目,也不知道如何在View中引用正确的路径。
请帮助吗?
更新1
第一个版本根据我设置的路由器呈现值为#/accounts/4
的href属性:
Social.Router.map(function() {
this.resource('accounts', function(){
this.resource('account', { path: ':account_id'});
});
});
当我将当前代码转换为视图时,如何模仿linkTo提供的功能?
答案 0 :(得分:1)
您可以在手柄模板中为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}}
helper source code,您将看到一个模块化且优雅的实现,它可以作为您自己实现的基础。我想你正在寻找的部分是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));
})
...
});
所以我想,从那里你可以了解它是如何工作的,并自己实现一些东西。如果有帮助,请告诉我。