我可以在模板like this中使用绑定:
{{view App.MyView fooBinding:author}}
但是当我对extend
like this执行相同操作时:
App.MyView = Ember.View.extend
fooBinding: "App.ApplicationController.author"
它不起作用。
我错过了什么?
答案 0 :(得分:0)
如果要绑定View
类,则应使用Controller
。
根据命名约定,名为AuthorView
的视图将查找AuthorController
或自动生成基本控制器。在您的代码中,您将设置绑定到类(表示类型)而不是实例(这是您的具体对象)。
如果你创建了一个控制器,你可以在那里定义一个author
属性,在你的视图类中,你可以定义一个绑定,例如fooBinding: "controller.author"
,因为它知道controller
是AuthorController
的实例。
App.AuthorController = Ember.Controller.extend
author: Author.create
firstName: 'Bill'
lastName: 'Buckley'
App.AuthorView = Ember.View.extend
templateName: 'author'
fooBinding: "controller.author"
fullName: (->
author = @get 'foo'
"#{author.get('firstName')} #{author.get('lastName')}"
).property 'firstName', 'lastName'
此方法会强制您在手柄模板中使用view.binding.property
:
<script type="text/x-handlebars" data-template-name='author'>
Written by {{view.fullName}}
<br />
From Controller binding "fooBinding": {{view.foo.firstName}} {{view.foo.lastName}}
</script>
(见fiddle)
另一种方法是通过author
从路线设置Route#setupController
属性:
Author = Ember.Object.extend
firstName: null
lastName: null
fullName: (->
author = @get 'foo'
"#{@.get('firstName')} #{@.get('lastName')}"
).property 'firstName', 'lastName'
App.ApplicationRoute = Ember.Route.extend
setupController: (controller, model) ->
controller.set 'author', Author.create
firstName: 'Bill',
lastName: 'Buckley'
您的模板可以直接访问author
属性,因为它位于该视图的控制器中:
<script type="text/x-handlebars" data-template-name='author'>
written by: {{author.fullName}}
</script>
(见fiddle)
这样您就不必在任何地方设置任何绑定。
注意:
在对象中创建计算属性,因为它不仅可以用于视图,还可以用于可能使用作者实例的其他对象,并避免使用undefined
初始化属性。
为了更好地使用Ember的功能,您可以为Author定义路径并使用content
实例设置控制器的Author
属性,并在模板中添加{{outlet}}
。框架将找到您的控制器并再次使用命名约定连接模板:
车把
<script type="text/x-handlebars" data-template-name='author'>
written by: {{fullName}}
</script>
<script type="text/x-handlebars">
{{outlet}}
</script>
咖啡
window.App = App = Ember.Application.create()
App.Router.map ->
@.route 'author', { path: '/'}
App.Author = Ember.Object.extend
firstName: null
lastName: null
fullName: (->
"#{@.get('firstName')} #{@.get('lastName')}"
).property 'firstName', 'lastName'
App.AuthorRoute = Ember.Route.extend
setupController: (controller, model) ->
# this could come from an api
controller.set 'content', App.Author.create
firstName: 'Bill',
lastName: 'Buckley'
App.AuthorController = Ember.ObjectController.extend()
(见fiddle)