UI路由器:在接收状态时初始化变量的最佳方法

时间:2015-10-29 13:59:51

标签: javascript angularjs angular-ui-router

我有两个州定义,一个“门票”匹配/门票......

$stateProvider // define los estados de mi aplicacion
  .state("tickets", { // le asocio propiedades a cada state
      url: "/tickets", // ruta
      templateUrl: "modules/tickets/views/ticketsTemplate.html", // template a usar
      controller: "TicketsController", // controller a usar
      controllerAs : "tickets" // alias para el controller, para utilizar el this
  });

和另一个“tickets.buscar”匹配/ ticket /:id使用与父级相同的控制器(“TicketsController”)......

.state("tickets.buscar",{
      url: "/:id",
      templateUrl: "modules/tickets/views/ticketsResult.html"
      }
  ) // heredo el controller del padre

在控制器中,我有一个init()函数来初始化所需的变量。

this.init = function(){
  this.title = "Tickets";
  this.id = $state.params.id;

  if(this.id){
    this.getTicket(this.id);
  };
};

this.init();

根据我在UI路由器文档中读到的内容,有三种方法可以访问状态:

  • 通过网址(或跟随外部链接)
  • 使用$ state.go()
  • 在html的
  • 中使用ui-sref

我正在寻找一种触发控制器重载的方法,这样无论状态如何被接收,init都会被执行。

我知道$ state.go()中的{reload:true}选项但只解决了其中一种访问方法,并且还检查了this other question但是解决方案不起作用, UI路由器的文档中没有记录$ state参数。

2 个答案:

答案 0 :(得分:1)

一种好方法可能是在创建状态时使用resolve对象,以便可以自动为您设置故障单。我没有对此进行测试,但这应该可行。

.state("tickets.buscar", {
    url: "/:id",
    templateUrl: "modules/tickets/views/ticketsResult.html",
    resolve: {
        ticket: function($state) {
            // return the output of `getTicket`
            // you would need to move the whole method here
        }
    }
}

然后,在您的控制器中,将ticket$scope以及所有内容一起注入。

angular.module('someModule')
.controller('TicketsController', ['$scope', 'ticket', function($scope, ticket) {
    console.log(ticket);
]);

答案 1 :(得分:-1)

我会使用`StateChangeSuccess'事件:

$rootScope.$on('$stateChangeSuccess', 
function(event, toState, toParams, fromState, fromParams){ 
    //initialize things here...
})