2014-12-05 3 views
0

У меня есть два контроллера: postsController и postController. почтовый маршрут НЕ вложен под сообщениями (я не хочу этого делать, потому что я хочу, чтобы просмотр заметок был замещен видом сообщения, а не добавлен к нему.)Содержимое контроллера массива Ember доступа от другого контроллера

Это то, что мой маршрутизатор выглядит.

this.resource('posts', {path: '/'}, function(){ 
    // this.route('index', {path: '/'}); 
    }); 

    this.resource('post', { path: 'posts/:id' }, function(){ 
    this.route('show'); 
    } 

Теперь PostsController:

App.PostsRoute = Ember.Route.extend({ 
    model: function(){ 
    return this.store.find('post'); 
    }, 
}) 

App.PostsController = Ember.ArrayController.extend({ 
    testProperty: "This is a test" 
}) 

И PostController:

App.PostRoute = Ember.Route.extend({ 
    model: function(params){ 
    return this.store.find('post', params.id); 
    }, 
}) 

App.PostController = Ember.ObjectController.extend({ 
    needs: ['posts'], 
    percentValue: 100, 
    progressBarWidth: null, 

    advancePost: function(delta) { 
    var that = this; 
    var posts = that.get('controllers.posts'); 
    // debugger <-- This is where all my questions are concerned with. 
    ... 
    }, 

    actions: { 
    nextPost: function() { 
     this.advancePost(1); 
    }, 
    previousPost: function() { 
     this.advancePost(-1); 
    }, 
    } 
}) 

Зв PostController 'needs' PostsController и на action advancePost должен получить доступ к модели PostsController (которая должна содержать массив Post Objects). В момент, когда мой отладчик, переменные сообщения имеют доступ к postsController. В этот момент, если я запустил

posts.get('testProperty') // => gives "This is a test", which is correct. 

на хром-консоли, я получаю «Это тест». Поэтому я знаю, что получил доступ к самому контроллеру сообщений. Однако любая из следующих попыток:

posts.get('model') // gives []?? 
posts.get('content') // gives []?? 

возвращает пустой массив ([]).

Я не понимаю, почему. Если у меня есть доступ к массиву MessageController, почему у меня нет доступа к его данным? Следовательно, как мне получить доступ к его данным?

Я очень благодарен за это.

ответ

0

Во-первых, если я понимаю ваш контекст, я думаю, вы должны скорее гнездо post под posts, делая это:

this.resource('posts', {path: '/'}, function(){ this.route('post', {path: '/:id'}); });

И потом, так как posts ваш «родительский» маршрут, вам больше не нужно для объявления зависимостей needs в вашем контроллере.

Чтобы получить доступ к получить ваши сообщения, применяются следующие в вашем Route:

setupController: function(controller, model) { this._super(controller, model); controller.set('posts', this.modelFor("posts").get("content")); }

+0

Кажется, мне тоже не нужно отправлять почту под посты. Однако пост настаивает на рендеринге в качестве части шаблона сообщений; Мне нужно заменить шаблон сообщений.На каждом посту есть кнопка, чтобы вернуться к списку. Подумайте, imgur или 9gag, или любой из сайтов обмена изображениями. Я чувствую, что это определенно лучший подход - и я хотел бы облегчить его, - но сэкономить на добавлении «скрытого» класса на каждом переходе, я ничего не могу придумать. В какой-то мере я ожидаю, что Ember будет иметь возможность заменить текущее представление на выходе с вложенным представлением; любая идея, как это можно сделать? – Darshan

+0

Сделайте ваши сообщения в 'posts/index' и детали в' posts/post'. Таким образом, они «логически» будут вложены, но останутся братьями и сестрами друг другу в шаблонах –

0

Вы должны думать о закономерностях взаимодействия вы хотите поддерживать. Это типично для пользователя, чтобы вернуться к списку предметов, которые они только что искали? Перезагрузка сообщений при сохранении позиции прокрутки в списке, на котором они были, будет проблематичной. Также повторная выборка с сервера и срыв и настройка DOM имеют намного больше накладных расходов, чем просто оставить его там.

Намерены ли вы использовать анимацию на своих переходах? Использование чего-то вроде жидкого пожара потребует обеих выходов, сделанных для выполнения анимации, поэтому нет смысла списывать список в этом случае.

CSS может использоваться для того, чтобы вложенная розетка заполняла любой контейнер, который он помещал, позволяя использовать подход, предоставляемый Паскалем Бутином.

+0

Чтобы ответить, да, было бы типично вернуться. Я согласен, что сообщения не должны повторяться повторно; Я думаю, что вложенность маршрута определенно является лучшим подходом. Однако сохраните для переключения «скрытый» класс, как я смогу заменить отображаемое сообщение в виде сообщения? – Darshan