我可以綁定到模板like this工作:灰燼結合模板工程,但不通過延長
{{view App.MyView fooBinding:author}}
但是,當我做同樣的extend
like this:
App.MyView = Ember.View.extend
fooBinding: "App.ApplicationController.author"
它不」工作。
我錯過了什麼?
我可以綁定到模板like this工作:灰燼結合模板工程,但不通過延長
{{view App.MyView fooBinding:author}}
但是,當我做同樣的extend
like this:
App.MyView = Ember.View.extend
fooBinding: "App.ApplicationController.author"
它不」工作。
我錯過了什麼?
如果你想綁定在View
類中,你應該使用Controller
。
根據命名約定,名爲AuthorView
的視圖將查找AuthorController
或自動生成基本控制器。在你的代碼中,你正在設置一個綁定到類(代表類型)而不是實例(這是你的具體對象)。
如果你創建一個控制器,你可以在那裏做定義author
財產,並在您的視圖類,你可以因爲它知道controller
是AuthorController
實例定義綁定,如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)
更改綁定到「controller.author」使我原來的例子工作。如果沒有AuthorController,AuthorView的控制器就是ApplicationController實例。 [小提琴](http://jsfiddle.net/vr2E5/5/) – treydavis
是的。發生這種情況是因爲應用程序控制器持有'author'對象,但是如果您移動到其他路徑,那麼可能無法使用相同的路徑('controller.author')。我知道你的示例不使用路由,但是一旦你的應用開始增長,你很可能會使用它,這就是爲什麼我使用作者的路由進行示例。 – MilkyWayJoe
爲什麼你不能使用第一種方法?你不能像這樣引用'ApplicationController',因爲這是類定義,而不是實例。 – CraigTeegarden
我只是在修補Ember以瞭解它是如何工作的。只是好奇:ApplicationController實例的路徑是什麼? – treydavis