感谢 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
文档中定义的格式。
请注意
用于启动视图的超音速ui 方法似乎存在一些问题。如果您运行以下代码:
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 方法,而是创建我自己的 preload 方法,我从附加到我的主视图的控制器中运行该方法(这样可以确保在应用程序加载时处理我想要预加载的所有视图)。这是执行此操作的函数:
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
and id
,并且当我以后使用我的start()
函数时,我不会有任何问题。
您需要确保您的structure.coffee
文件没有任何preload
说明,以免创建您以后会遇到问题的重复视图。
最后,我有一个 2 个级别的视图,这是一个通过 AJAX 操作发布数据的表单。我希望视图在 AJAX 操作完成后返回到之前的视图。使用我之前的功能导致push()
被拒绝。如果 AppGyver Supersonic 能够智能地检测到推送到上一个视图应该默认为layers.pop
操作,那就太好了,但您并不总是得到您想要的。无论如何,我设法使用 解决了这个问题supersonic.ui.layers.pop()
,它只是完成了“后退”按钮所做的事情。
现在一切都按预期工作。