2013-04-18 43 views
0

我可以綁定到模板like this工作:灰燼結合模板工程,但不通過延長

{{view App.MyView fooBinding:author}} 

但是,當我做同樣的extendlike this

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

它不」工作。

我錯過了什麼?

+0

爲什麼你不能使用第一種方法?你不能像這樣引用'ApplicationController',因爲這是類定義,而不是實例。 – CraigTeegarden

+0

我只是在修補Ember以瞭解它是如何工作的。只是好奇:ApplicationController實例的路徑是什麼? – treydavis

回答

0

如果你想綁定在View類中,你應該使用Controller

根據命名約定,名爲AuthorView的視圖將查找AuthorController或自動生成基本控制器。在你的代碼中,你正在設置一個綁定到類(代表類型)而不是實例(這是你的具體對象)。

如果你創建一個控制器,你可以在那裏做定義author財產,並在您的視圖類,你可以因爲它知道controllerAuthorController實例定義綁定,如fooBinding: "controller.author"

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財產,並添加一個{{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

+0

更改綁定到「controller.author」使我原來的例子工作。如果沒有AuthorController,AuthorView的控制器就是ApplicationController實例。 [小提琴](http://jsfiddle.net/vr2E5/5/) – treydavis

+0

是的。發生這種情況是因爲應用程序控制器持有'author'對象,但是如果您移動到其他路徑,那麼可能無法使用相同的路徑('controller.author')。我知道你的示例不使用路由,但是一旦你的應用開始增長,你很可能會使用它,這就是爲什麼我使用作者的路由進行示例。 – MilkyWayJoe