Если вы хотите связать себя в классе 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, вы можете определить маршрут Автор и установить 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)
Почему вы не можете использовать первый метод? Вы не можете ссылаться на 'ApplicationController', как это, потому что это определение класса, а не экземпляр. – CraigTeegarden
Я просто возился с Эмбер, чтобы понять, как это работает. Просто любопытно: Каким будет путь для экземпляра ApplicationController? – treydavis