Durandal 2.0 navigationBack() вызывает полное обновление страницы

Я пытаюсь заставить функцию router.navigateBack работать правильно, используя Durandal 2.0.1.

У меня есть модель представления, которая может создать объект, который мы назовем лидом. После создания нового лида я хочу заменить uri, чтобы он имел маршрут редактирования лида вместо маршрута создания лида, а также заменить его в истории. Я вызываю следующую функцию после сохранения:

router.navigate('#lead/' + vm.lead().id(), { replace: true, trigger: false });

вот описание маршрута в моем конфигурационном файле

{
    route: 'lead(/:leadId)',
    moduleId: 'lead/lead'
}

Потом потом, когда я звоню

router.navigateBack();

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

В Durandal 1.0 я просто звонил

router.replaceLocation();

Для выполнения этой же задачи, и это будет работать хорошо. Мне интересно, если я что-то пропустил здесь.


person John Gurski    schedule 19.04.2014    source источник


Ответы (1)


Попробуйте следующее:

var leadId = vm.lead.peek().id.peek();
router.navigate('#lead/' + leadId, { replace: true, trigger: false });

Я считаю, что у вашего наблюдаемого есть зависимость, которая вызывает полный пересчет. Мы можем использовать peek() Knockout для получения значения без создания зависимости.

person Community    schedule 22.04.2014
comment
Спасибо за помощь. Это сработало отлично! У меня похожая проблема возникает при попытке удалить лид. при удалении я звоню - person John Gurski; 23.04.2014
comment
тот же тип метода, но используйте {replace: true, trigger: true}, чтобы уйти и заменить в истории после удаления. Я получаю ту же проблему с обновлением страницы, когда после этого вызываю метод router.navigateBack(). Я заменил ссылку на наблюдаемые на ссылку для просмотра, но это не решило проблему, когда триггер: true. Я нашел обходной путь для этого, не заменив маршрут и просто отменив навигацию в методе canActivate при попытке перейти к удаленной записи, так что это не большая проблема для меня, но если вы знаете, где я снова ошибся, я был бы признателен за вход. - person John Gurski; 23.04.2014
comment
вау .. Только что понял, что это не решило мою проблему ... также понял, что эта проблема характерна для браузера Google Chrome. Всякий раз, когда я вызываю router.navigateBack() и пытаюсь уйти от маршрута, который был установлен с помощью router.navigate('#...', { replace: true }), я получаю полное обновление страницы - person John Gurski; 23.04.2014
comment
@JohnGurski Просто после ваших комментариев. В последнем комментарии вы говорите «Просто понял, что это не решило мою проблему». Вы имели в виду моё предложение или что-то в предыдущих двух комментариях? Если первое, то мне нужно смотреть глубже. Спасибо. - person ; 24.04.2014
comment
Ваше предложение не решило мою проблему, пожалуйста, игнорируйте мои первые два комментария, я обманывал себя! Мой последний комментарий в значительной степени решает проблему. navigationBack() всегда работает нормально для меня, за исключением случаев, когда я ухожу от маршрута, который был установлен с помощью {replace: true} (происходит только в Chrome, а не в IE11). - person John Gurski; 24.04.2014
comment
Я проследил за стеком до строки 290 в модуле durandal/history, где определена функция history.navigateBack. Похоже, что вместо использования хеш-маршрутизации хром решает вызвать мой контроллер MVC, где представление index.cshtml содержит сценарий приложения/основного. Мне интересно, связано ли это с тем фактом, что у меня нет файла index.cshtml в корневой папке, а вместо этого в моей папке представлений для соответствующего контроллера MVC. Я ценю ваши усилия! - person John Gurski; 24.04.2014
comment
@JohnGurski Вы знаете, я никогда не помещал файл index.cshtml куда угодно, кроме корня. Возможно, вам следует переместить его в корень и посмотреть, что произойдет. Мне интересно, как он вообще достигает индексного файла. - person ; 24.04.2014
comment
Я использую этот подход, чтобы легко использовать систему аутентификации личности. У меня есть атрибут авторизации в моем контроллере приложения, и при входе в систему я перенаправляюсь на метод индекса в контроллере приложения, который содержит мое приложение/основной скрипт. Я бы хотел, чтобы это было так, но я проверю пример приложения, если проблема все еще возникает с индексом в корне. - person John Gurski; 24.04.2014
comment
@JohnGurski А, хорошо. Имеет смысл. - person ; 24.04.2014