Спасибо LeedsEbooks за помощь в решении этой задачи. Я смог найти решение. Вот код:
var start = function(route_str, isModal) {
var regex = /(.*?)#(.*)/g;
var match_obj = regex.exec(route_str);
var view_id_str = match_obj[2],
view_location_str = route_str,
view = new supersonic.ui.View({
location: view_location_str,
id: view_id_str
});
view.isStarted().then(function(started) {
if (started)
{
if (isModal)
{
supersonic.ui.modal.show(view);
}
else {
supersonic.ui.layers.push(view);
}
}
else
{
// Start Spinner
supersonic.ui.views.start(view).then(function() {
if (isModal)
{
supersonic.ui.modal.show(view);
}
else
{
supersonic.ui.layers.push(view);
}
// Stop Spinner
}, function(error) {
// Stop Spinner
A.error(error);
});
}
});
};
Вы должны убедиться, что ваш маршрут имеет формат module#view
, как определено в документации.
ВНИМАНИЕ
Кажется, возникла проблема с сверхзвуковым методом пользовательского интерфейса для запуска представлений. Если вы запустите следующий код:
supersonic.ui.views.start("myapp#first-view");
supersonic.ui.views.find("first-view").then( function(startedView) {
console.log(startedView);
});
Вы заметите, что ваши представления id
и location
идентичны. Это кажется неправильным, так как id
должно быть first-view
, а location
должно быть myapp#first-view
.
Поэтому я решил не использовать методы AppGyver и вместо этого создал свой собственный метод предварительной загрузки, который я запускаю из контроллера, подключенного к моему домашнему представлению (это гарантирует, что все представления, которые я хочу предварительно загрузить, обрабатываются при загрузке приложения). Вот функция для этого:
var preload = function(route_str)
{
var regex = /(.*?)#(.*)/g;
var match_obj = regex.exec(route_str);
var view = new supersonic.ui.View({
location: route_str,
id: match_obj[2]
});
view.start();
};
Делая это, я уверен, что представление будет загружено с правильными location
и id
, и что, когда я буду использовать свою функцию start()
позже, у меня не будет никаких проблем.
Убедитесь, что в вашем файле structure.coffee
нет инструкций preload
, чтобы не создавать повторяющиеся представления, с которыми у вас позже возникнут проблемы.
Наконец, у меня есть двухуровневое представление, которое представляет собой форму, которая отправляет данные через операцию AJAX. Я хотел, чтобы представление возвращалось к предыдущему представлению, когда операция AJAX была завершена. Использование моей предыдущей функции привело к отклонению push()
. Было бы неплохо, если бы AppGyver Supersonic мог разумно определять, что переход к предыдущему представлению должен по умолчанию выполняться как операция layers.pop
, но вы не всегда получаете то, что хотите. Во всяком случае, мне удалось решить эту проблему с помощью supersonic.ui.layers.pop()
, который просто делает то, что сделала бы кнопка «Назад».
Теперь все работает как задумано.
person
BannerMan
schedule
28.03.2015