我正在使用angular router`来跟踪我的网络应用程序状态,如下所示:
when('/', {
controller: "AController",
templateUrl: "APanel.html"
}).
when('/subpage/:id', {
controller: "BController",
templateUrl: "BPanel.html"
}).
我正在使用Angular Service
来跟踪某些共享值:
app.service('stateService', function() {
this.someSwitch = false;
this.someLongDataArray = [x, y, z];
});
目前,在从\subpage\:id
更改AController
网址的路径之前,我会为服务成员分配新值,因此可以在子页面中引用它们。
现在的问题是,如果用户直接启动子页面网址\subpage\:id
,或者点击浏览器子页面上的刷新按钮,则会调用BController,我将丢失值本应由AController准备的服务。
我想知道在这种情况下我应该做些什么。有什么方法可以在用户直接启动子页面时调用,所以我有机会准备数据吗? (也许我可以观看html onload事件,但不确定这是最好的答案)。
由于
答案 0 :(得分:1)
看来,BController依赖于AController。 理想情况下,Controller不应包含任何数据/ dom操作,状态维护。它只是视图和$ scope模型之间的粘合剂。 这样说,你不需要在控制器之间创建任何这样的依赖。可以从两个控制器调用该服务。
或强> 如果确实要求在加载BPanel.html之前必须加载/初始化APanel.html,那么您必须在BContoller中检查一些标志并将用户重定向到APanel.html。 像
if(<check some flag>){
$location.path('/');
}
但是你必须找到将用户再次重定向到BPanel.html的方法。我想这不是推荐的方法。
答案 1 :(得分:0)
我不确定我是否完全接受了您的问题。但是,如果用户可能直接点击BPanel.html
,那么你应该做这样的事情。
if(serviceExists()){
//Do your usual Bcontroller stuff here if the services was initialized
}
else{
//Show a warning/error like "Oops, something is wrong go back to '/'" OR
// Initialize services in BController
}
如果在BController之前初始化您的服务非常重要,那么这应该在您的BController中。你基本上强迫人们留在AController上。