2014-01-09 6 views
0

У меня довольно простая форма, но она никогда не должна иметь никакого состояния. Я начал читать более старую дискуссию о том, как вы можете использовать itemControllerClass для получения класса «singleton», созданного каждый раз, когда вы вводите маршрут.Как использовать itemControllerClass для достижения одноэлементного опыта работы с ember.js

Если я хочу использовать это, как подключить его к шаблону и подключить его к материнскому контроллеру?

Вот что я предполагаю, что вы могли бы сделать с яваскриптом стороны

App.FooController = Ember.Controller.extend({ 
    itemControllerClass: 'someclass_name' 
}); 

Единственными «должен иметь», что мне нужно, чтобы иметь доступ к родительскому маршруту Params от контроллера ребенка одноплодного.

Любое руководство будет превосходным, если вы заранее!

Update

Просто чтобы быть ясно, о мой случай использования -это не является ArrayController. На самом деле у меня есть контроллер (как показано выше). Мне не нужно проксировать модель или массив моделей. Я ищу способ указать URL-адрес (с несколькими параметрами) и создать новый экземпляр при загрузке маршрута (или показан родительский контроллер).

Я делаю это, потому что шаблон представляет собой простую «пустую форму», которая не должна и не должна содержать состояние с ней. когда пользователь сохраняет форму и я перехожу к указательному маршруту, все, что произошло в этой форме, может умереть вместе с ней (поскольку я кэшировал данные в данных ember или закончил мой файл $ .ajax/etc)

Кто-нибудь знает как выполнить это поведение без гражданства с помощью контроллера?

+0

Не могли бы вы объяснить немного больше о том, чего вы пытаетесь достичь? –

+0

Как насчет того, если вы создаете новую модель в крючке модели всякий раз, когда пользователь нажимает на этот маршрут и использует это в качестве базовой модели для FooController. Я думаю, что до тех пор, пока атрибуты, используемые в форме, соответствуют атрибутам в модели, а FooController - ObjectController, тогда вы должны иметь возможность сохранять модель и иметь пустую форму всякий раз, когда вы набираете маршрут. Есть ли что-то еще для вашего случая использования? – Adam

+0

Интересно - мне нравится этот подход. Позвольте мне повторить эту ночь, и я отчитаю :) –

ответ

2

Я держу пари, что вы говорите об обсуждении this. Это одно из моих личных любимых открытий, связанных с Эмбером. Результатом этого было свойство itemController объекта ArrayController; Я использую это все время. Основной смысл этого заключается в том, что когда вы выполняете итерацию над контроллером массива, вы можете изменить контрольный контроллер в цикле. Таким образом, при каждом повторении цикла он будет предоставлять новый контроллер указанного вами типа. Вы можете указать itemController как свойство в ArrayController или в качестве опции в помощнике handle {{#each}}. Таким образом, вы могли бы сделать это следующим образом:

App.FooController = Ember.ArrayController.extend({ 
    itemController: 'someclass' 
}); 

App.SomeclassController = Ember.ObjectController.extend({}); 

Или, как это:

{{#each something in controller itemController='someclass'}} 
... 
{{/each}} 

В itemController, вы можете получить доступ к родительскому контроллеру (FooController, в данном случае), как:

this.get('parentController'); 

Или вы можете указать зависимость, используя needs, как обычно в контроллере. Итак, пока параметры доступны для parentController, вы также сможете получить к ним доступ на дочернем контроллере.

Update

Выслушав больше о прецеденте, где состоянию А контроллер необходимо сбросить каждый раз, когда переход происходит на конкретный маршрут, это звучит, как правильный подход заключается в модели подложки для контроллер. Затем вы можете создать новый экземпляр модели на одном из крючков маршрута; вероятно, либо model, либо setupController.

+1

Это отличное объяснение, esp [этот комментарий] (https://github.com/emberjs/ember.js/issues/1637#issuecomment-11785445). Спасибо за ссылку –

+0

Я обновил свой вопрос -no ArrayController в этом сценарии (спасибо за помощь) –

0

От http://emberjs.com/api/classes/Ember.ArrayController.html

Иногда вы хотите отобразить вычисляемые свойства в теле помощника #each, которые зависят от основных элементов в содержании, но нет по этим пунктам. Для этого установите itemController на имя контроллера (возможно, ObjectController), который будет обертывать каждый отдельный элемент.

Например:

{{#each post in controller}} 
<li>{{title}} ({{titleLength}} characters)</li> 
{{/each}} 

App.PostsController = Ember.ArrayController.extend({ 
    itemController: 'post' 
}); 

App.PostController = Ember.ObjectController.extend({ 
// the `title` property will be proxied to the underlying post. 

titleLength: function() { 
return this.get('title').length; 
}.property('title') 
}); 

В некоторых случаях полезно возвращать различные itemController в зависимости от конкретного пункта. Подклассы могут сделать это, переопределив lookupItemController.

Например:

App.MyArrayController = Ember.ArrayController.extend({ 
lookupItemController: function(object) { 
if (object.get('isSpecial')) { 
    return "special"; // use App.SpecialController 
} else { 
    return "regular"; // use App.RegularController 
    } 
} 
}); 

Экземпляры itemController будет иметь свойство parentController установить либо в собственности parentController от ArrayController или к самим экземпляром ArrayController.

Смежные вопросы