AngularJS Router在最初加载某个URL时调用函数

时间:2015-01-05 04:50:24

标签: javascript angularjs angular-ui-router

我正在使用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事件,但不确定这是最好的答案)。

由于

2 个答案:

答案 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上。