2013-04-18 2 views
0

я могу получить привязки для работы в шаблоне like this:Ember-переплетных работ в шаблоне, но не через расширения

{{view App.MyView fooBinding:author}} 

Но когда я делаю то же самое с extendlike this:

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

Безразлично» т работы.

Что мне не хватает?

+0

Почему вы не можете использовать первый метод? Вы не можете ссылаться на 'ApplicationController', как это, потому что это определение класса, а не экземпляр. – CraigTeegarden

+0

Я просто возился с Эмбер, чтобы понять, как это работает. Просто любопытно: Каким будет путь для экземпляра ApplicationController? – treydavis

ответ

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, вы можете определить маршрут Автор и установить 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)

+0

Изменение привязки к «controller.author» делает мой оригинальный пример работы. Без AuthorController контроллер AuthorView является экземпляром ApplicationController. [скрипка] (http://jsfiddle.net/vr2E5/5/) – treydavis

+0

Да. Это происходит потому, что контроллер приложения содержит объект 'author', но если вы перейдете на другой маршрут, это может не работать с одним и тем же путем (' controller.author'). Я знаю, что ваш образец не использует маршрут, но как только ваше приложение начнет расти, вы, скорее всего, его используете, поэтому я сделал образец, используя маршрут для автора. – MilkyWayJoe