2013-04-28 1 views
5

я установка State диспетчера для отслеживания состояния входа пользователя, на основе этого ответа здесь: Change Navbar based on login stateрозетка Ember обязана StateManager не делает после изменения состояния дважды

Однако, я хотел бы взять его следующий шаг и не только обновление навигация в соответствии с состоянием, но и основной шаблон. Я получил эту работу в основном, так что, когда вы нажмете кнопку входа в систему, она покажет вам «приветствую, что вы вошли в систему». Однако, если вы выходите из системы и снова пытаетесь войти в систему, он просто показывает пустой экран, как если бы он неправильно перерисовывал указательный маршрут. Вот JSFiddle с моей проблемой. Обратите внимание, что происходит, когда вы нажимаете на логин/выход из системы, а затем заходите в 2-й раз. сообщение «welcome» не отображается.

Вот мой шаблон индекс:

{{render navbar}} 
     {{authState}} 
{{#if isAuthenticated}} 
    {{outlet}} 
{{else}} 
    {{render login}} 
{{/if}} 

Я могу видеть «authState» является правильным, но «на выходе» не отображается 2-й раз, когда я логин ...

Вот полная jsfiddle:

http://jsfiddle.net/Benmonro/HmJyu/1/

РАЗЪЯСНЕНИЕ

@ham попросил разъяснений, так что здесь идет:

Главное, что я пытаюсь достичь здесь в том, что, когда государственный менеджер изменяет состояние isAuthenticated то, что в настоящее время оказанной в {{outlet}} должна быть выгружена для того, что отображается в {{render login}}, который действительно может быть любым шаблоном. Главное, что {{outlet}} будет отображаться и скрываться с изменением состояния ...

ответ

2

Причина, по которой она не работает, состоит в том, что у вас есть два узла DOM с идентификатором index. В вашей скрипке дополнительно </script> в конце HTML-панели, но это не имеет значения, я думаю.

ID в DOM должен быть уникальным, иначе вы можете увидеть некоторые неожиданные проблемы, подобные этому. Вы можете прочитать здесь https://developer.mozilla.org/en/docs/DOM/element.id

Здесь работает вилку вашей скрипки - http://jsfiddle.net/wbednarski/eMcXq/

Кстати, Вы можете найти полезную, а также - Difference between == and === in JavaScript

+0

На самом деле это решение по-прежнему не решает реальной проблемы, которая заключается в том, что {{outlet}} не отображается дважды. Я обновил скрипт, переименовав скрипт «index» в «welcome», и вы можете увидеть, что он по-прежнему демонстрирует то же поведение: http://jsfiddle.net/Benmonro/HmJyu/3/ Кроме того, t name, что второй скрипт 'index', как я могу определить этот скрипт как путь по умолчанию в маршруте? – Ben

+0

@ У вас все еще есть более одного идентификатора в DOM, например, для входа в систему ... Другое дело, что ваш man manger не имеет никакого отношения к рендерингу на выходе - его в вашем навигационном контроллере. Я думаю, вы можете удалить код менеджера состояния и 'if' в шаблоне, и когда вы нажмете login в правом верхнем углу, вы увидите приветственное сообщение. Второй вопрос: да, вы не можете иметь шаблоны, называемые индексом, на условные обозначения Ember. Другое дело, чтобы сохранить каждый шаблон в отдельном файле, а не глупые скриптовые теги, вы можете зарегистрировать внешние файлы, такие как Ember.TEMPLATES [name] = Ember.Handlebars.compile(); –

+0

спасибо за советы, я немного нуб с Эмбером, я видел ульбер-инструменты, на которые я бы хотел переключиться, но не успел. Я просто уходил с гидов и примеров, определенно хочу использовать Ember.TEMPLATES. Несмотря на это, я прошел через и удалил все дубликаты идентификаторов, но проблема все еще существует. Здесь я снова обновил JSFiddle. http://jsfiddle.net/Benmonro/HmJyu/4/ Причина, по которой я хотел бы иметь выходную работу таким образом, заключается в том, что если вы выходите на определенный маршрут (например,/posts/1/edit) то, когда вы входите в систему, вы вернетесь туда. – Ben

2

Вы не переходящие из вашего router, но только изменение состояния вашего LoginStateManager. Если вы включите вывод маршрутизации в своем создании App, вы увидите результат и отсутствие перехода из вашего «приветственного» состояния.

Просто изменить App к:

App = Ember.Application.create ({LOG_TRANSITIONS: истинные});

Вы увидите, что с помощью login -Кнопка на navBar будет выполнять правильную функцию только один раз, когда кнопка на login форме не переходит состояние, и для этого не показывает правильный результат.Это потому, что в App.NavBarController вы выполняете this.transitionToRoute("welcome").

Просто введите все ваши логины и логины с помощью: или this.transitionToRoute("index") и он работает как шарм.

[edit] Добавлен пример скрипки здесь: http://jsfiddle.net/AlphaEagle/rGNca/4/ Надеюсь, это поможет! [/ edit]

+0

hmm, interesting. я обновил свою скрипку, но она все еще не работает, вы можете развить и, может быть, показать мне, что вы имеете в виду? http://jsfiddle.net/Benmonro/HmJyu/5/ Также звонок, который я добавил для перехода ToRoute («добро пожаловать»), должен был просто доказать точку, что розетка не отображает после второго. То, что я * действительно хочу, - это выход, который должен был быть на месте ... если это возможно. поэтому процесс может быть таким: пользователь переходит в/posts/1/edit (not auth'd) пользователь регистрируется в пользователь возвращается на/сообщения/1/edit Или если они были в/сообщения/новые Я бы хотел, чтобы он вел себя так же ... – Ben

+1

Я действительно создал скрипку, но позже, кажется, мы пересекли пути. Что касается того, что вы делаете, я столкнулся с теми же проблемами. Я все еще работаю над этим, но думаю, что у меня это работает, позволяя рознице оставаться неизменным и отображать в том же маршруте. – harn145

+0

прохладный. я начал думать, может быть, я был сумасшедшим. Я могу опубликовать этот вопрос в вопросах emberjs на github ... – Ben

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