Ember绑定在模板中工作,但不通过扩展

时间:2013-04-18 18:55:07

标签: ember.js

我可以在模板like this中使用绑定:

{{view App.MyView fooBinding:author}}

但是当我对extend like this执行相同操作时:

App.MyView = Ember.View.extend
    fooBinding: "App.ApplicationController.author"

它不起作用。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

如果要绑定View类,则应使用Controller

根据命名约定,名为AuthorView的视图将查找AuthorController或自动生成基本控制器。在您的代码中,您将设置绑定到类(表示类型)而不是实例(这是您的具体对象)。

如果你创建了一个控制器,你可以在那里定义一个author属性,在你的视图类中,你可以定义一个绑定,例如fooBinding: "controller.author",因为它知道controllerAuthorController的实例。

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