2012-06-15 5 views
2

Я строю приложение sencha touch 2, используя маршруты. Если я понимаю напрямую, для этого требуется указать маршруты в вашем контроллере и оставить вашу функцию app.launch пустой (или, по крайней мере, не загружать вид/вызов контроллера там).Sencha Touch 2 маршрут по умолчанию

Один из моих контроллеров определяет "" маршрут, который будет загружаться, когда URL хеш-часть пустая (http://localhost/):

Ext.define('SOP.controller.PartyController', { 
    extend: 'Ext.app.Controller', 

    config: { 
     routes: { 
      "": "showChooseParty" 

до сих пор так хорошо ....

Однако в этот случай, если хэш-часть содержит некоторый барахл (например, http://localhost/#tralala, когда нет маршрута tralala, указанного в любом контроллере), приложение просто зависает на экране загрузки: никакое действие не вызывается, а функция запуска пуста. Я бы хотел, чтобы маршрут был загружен, когда хеш-часть не соответствует известному маршруту (хэш-часть нежелательной почты может быть маршрутом в предыдущей версии приложения или facebook, пытаясь сделать меня счастливым, поставляя accesstoken в хеше в перенаправлении).

У меня есть обходной путь работает в функции запуска:

launch: function() { 
    if (!this.getRouter().recognize(window.location.hash.substr(1))) { 
     window.location.hash = ""; 
    } 
}, 

однако мне не нравится код, указывающий непосредственно на хэш, его работа зависит от запуска() вызывается до того, как маршрут в первый раз, а объект this.getRouter() - "private" and not supposed to be used.

Итак, мой вопрос, что такое «правильный» способ предоставления маршрута по умолчанию? Или я полностью теряю смысл использования маршрутов?

ответ

2

После проверки хэш-значение в функции запуска, вы можете сделать следующее ...

this.getApplication().getHistory().add(Ext.create('Ext.app.Action', { 
     url : 'home' 
    })); 

Теперь вы можете использовать «домой» в качестве маршрута по умолчанию вместо пустой хэш.

+0

Это работает отлично, но в sencha 2.3.1 Ext.app.Action помечено как личное. (Http://docs.sencha.com/touch/2.3.1/#!/api/Ext.app.Действие) Итак, каков правильный способ установки элемента в истории приложения? – smarques

0

Я знаю, что прошло какое-то время, и мне интересно узнать, что еще вы можете найти, но я только что реализовал следующее: Поскольку маршруты Sencha Touch 2 являются короткозамкнутыми, то есть, найдено, Ext прекращает поиск - вы можете добавить Error контроллер к концу вашего controllers списка и добавить маршрут, который соответствует любому:

в моем app.js у меня есть:

... 
controllers: ['Whatever', 'AnotherOne', 'Error'], 
... 

Я определяю все, routes Мне нужно в первых двух контроллерах, затем в app/controller/Error.js У меня есть следующее:

... 
config: { 
    routes: { 
    ':foobar': { 
     action: 'showNotFound', 
     conditions: { 
     ':foobar': ".+" 
     } 
    } 
    } 
} 
... 
showNotFound: function(hash) { 
    // do whatever you need to 
} 

Итак, кто собирается domain.com # любых/456 получит контроллер Whatever, который может показать вид пункта # 456, но если Ext получает весь путь вниз к :foobar маршруту контроллера Error то они попадут на мою страницу «404».

ПРИМЕЧАНИЕ: Ваш маршрут :foobar (404, Not Found и др.) ДОЛЖЕН БЫТЬ ПОСЛЕДНИМ. Это означает последний контроллер в списке и последний маршрут в конфиге. В противном случае он ударит перед чем-либо после него.