Отключение розеток/удаление представлений при смене состояний в роутере Ember?

У меня есть приложение с шаблоном приложения, которое имеет два выхода. Когда я вхожу в состояние root.index, я хочу, чтобы была подключена только одна розетка, а когда я вхожу в состояние root.chats, я хочу, чтобы были подключены обе розетки. Это отлично работает, когда я перехожу от root.index к root.chats, но когда я возвращаюсь назад, выход navpane все еще присутствует (как и должно быть). Как мне отключить эту розетку или удалить представление, которое было подключено в первую очередь? Является ли метод disconnectOutlet для примеси контроллера устаревшим? Должен ли я структурировать это совершенно по-другому? Я включил свой код ниже. Спасибо.

// State flag helper function. See https://github.com/ghempton/ember-router-example/blob/master/js/app.js

function stateFlag(name) {
  return Ember.computed(function() {
    var state = App.router.currentState;
    while(state) {
      if(state.name === name) return true;
      state = state.get('parentState');
    }
    return false;
  }).property('App.router.currentState');
}

// Application

App = Em.Application.create({

    ApplicationController: Ember.Controller.extend({
        isChats: stateFlag('chats')
    }),
    ApplicationView: Ember.View.extend({
        templateName: 'application'
    }),
    ChatlistController:  Em.Controller.extend({
        hideView: false
    }),
    ChatlistView:  Em.View.extend({
        templateName:  'chatlist',
        didInsertElement: function(){
            this.$("#nav_pane").css({'left':'-=275', 'z-index':'-5'}).animate({
                left: ["+=275", 'swing'],
            },500,function() {
                $(this).css('z-index','5')
            });
        },
        _hideViewChanged: function() {
            if (this.get('hideView')) {
                this.hide();
            }
        }.observes('hideView'),
        hide: function() {
            var that = this;
            this.$("#nav_pane").hide("slow", function() {
                that.remove();
            });
        }
    }),
    ChatroomController:  Em.Controller.extend({

    }),
    ChatroomView:  Em.View.extend({
        templateName:  'chatroom'
    }),
    DashboardController:  Em.Controller.extend({

    }),
    DashboardView:  Em.View.extend({
        templateName:  'dashboard'
    }),
    Router: Ember.Router.extend({
        //location: 'history',
        enableLogging: true,
        goToDashboard:  Ember.Route.transitionTo('root.index'),
        goToChats:  Ember.Route.transitionTo('root.chats'),
        root:  Ember.Route.extend({
            index:  Ember.Route.extend({
                route:  '/',
                connectOutlets: function(router, context) {
                    router.get('applicationController').connectOutlet('content', 'dashboard');
                }
            }),
            chats:  Ember.Route.extend({
                route:  '/chats',
                connectOutlets: function(router, context) {
                    router.get('applicationController').connectOutlet('navpane', 'chatlist');
                    router.get('applicationController').connectOutlet('content', 'chatroom');
                }
            }),
            files:  Ember.Route.extend({
                route:  '/files'
            })
        })
    })
});

App.initialize();

person Max Gillett    schedule 21.10.2012    source источник
comment
Это почти тот же самый вопрос, который я задал сразу после вашего. Интересно, как это произошло. В моем случае розетки, используемые подстраницами в расширенном примере на Embers на веб-сайте, остаются подключенными, даже если они не должны быть подключены, когда вы возвращаетесь на домашнюю страницу.   -  person Mark    schedule 21.10.2012


Ответы (1)


Я полагаю, вы ищете disconnectOutlet, который вовсе не устарел: http://emberjs.com/api/classes/Ember.Controller.html#method_disconnectOutlet

Хорошее место для его размещения — событие exit маршрута: http://emberjs.com/api/classes/Ember.State.html#event_exit

chats:  Ember.Route.extend({
    route:  '/chats',
    connectOutlets: function(router, context) {
        router.get('applicationController').connectOutlet('navpane', 'chatlist');
        router.get('applicationController').connectOutlet('content', 'chatroom');
    },
    exit: function(router){
      router.get('applicationController').disconnectOutlet('chatroom');
    }
}),
person Trek Glowacki    schedule 21.10.2012
comment
Только что понял, что предварительная сборка ember не содержала коммитов после 3 августа. Отлично работает сейчас. Спасибо. - person Max Gillett; 22.10.2012