2013-02-11 2 views
0

У нас проблема с нашим базовым приложением. Мы хотим предоставить пользователю уведомление при сбое выборки (тайм-аут или общая ошибка), но мы хотим отобразить диалог поверх содержимого предыдущей страницы, а не показывать сообщение об ошибке на новой странице (как Facebook/LinkedIn и т. Д. it)Уведомление об отказе от базовой линии

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

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

Мы также исследовали установку какого-либо флага, говорящего нашему маршрутизатору, чтобы он не повторно запрашивал данные при следующем изменении маршрута, но это может вызвать проблемы, когда браузер возвращается к предыдущему экрану, на котором выборка выходит из строя. В этом случае нам нужно будет отправить пользователя «вперед» в их путешествие. Насколько нам известно, это невозможно с помощью менеджера истории браузера.

Есть ли способ иметь диалог, как мы хотим, или нам придется идти так же, как Facebook/LinkedIn и co.?

ответ

1

У вас есть пример кода/прочего?

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

window.product_v = Backbone.View.extend({ 
    render: function() { 
     this.model.fetch({ 
      processData: true, 
      data: this.model.attributes, 
      success : function(d){ 
      }, 
      error : function(d) { 
       MyRouter.previous(); 
      } 
     }) 
    } 
}); 

Тогда в вашем маршрутизаторе может храниться массив вашей истории, чтобы маршрут не был вызван при перенаправлении. или просто делать:

Backbone.history.navigate(route, {trigger: false, replace: true}); 

Ниже вопрос/ответ описывает это прекрасно:

Silently change url to previous using Backbone.js

class MyRouter extends Backbone.Router 
    constructor: (options) -> 
     @on "all", @storeRoute 
     @history = [] 
     super options 

    storeRoute: -> 
     @history.push Backbone.history.fragment 

    previous: -> 
     if @history.length > 1 
      @navigate @history[@history.length-2], true 
+0

Спасибо за ответ. Я не уверен, что это решит все проблемы, так как браузер все равно будет иметь страницу, на которую пользователь перешел в историю, поэтому удары будут, по сути, перемещать пользователя вперед. Есть ли способ полностью удалить маршрут из истории браузера. – brins0