Angular UI Router - 在子状态共享控制器时,为父级重置状态参数

时间:2017-01-25 20:05:32

标签: javascript angularjs routing angular-ui-router state

我有一个由两个子状态(detail.Controller)使用的控制器。

父状态(QUIZ1& QUIZ3)具有不同的控制器,可将不同的数据推送到父作用域(quiz1.Controller& quiz3.Controller

routes.js:

{
      name: 'QUIZ1',
      abstract: true,
      url: '/quiz1',
      templateUrl: 'app/html-partials/quiz.html',
      controller: require('./app/controllers/quiz1.Controller').inject(angular.module('app', ['ui.router', require('angular-sanitize')]))
    },
    {
      name: 'QUIZ1.detail',
      url: '/:page',
      templateUrl: 'app/html-partials/quiz.detail.html',
      params: {
        page: {
          value: '0',
          squash: true
        },
        score: {
          value: '0',
          squash: true
        },
        timer: {
          value: false,
          squash: true
        }
      },
      controller: require('./app/controllers/detail.Controller').inject(angular.module('app', ['ui.router', require('angular-sanitize')]))
    },
    {
      name: 'QUIZ2',
      // some other state stuff
    },
    {
      name: 'QUIZ3',
      abstract: true,
      url: '/quiz3',
      templateUrl: 'app/html-partials/quiz.html',
      controller: require('./app/controllers/quiz3.Controller').inject(angular.module('app', ['ui.router', require('angular-sanitize')]))
    },
    {
      name: 'QUIZ3.detail',
      url: '/:page',
      templateUrl: 'app/html-partials/quiz.detail.html',
      params: {
        page: {
          value: '0',
          squash: true
        },
        score: {
          value: '0',
          squash: true
        },
        timer: {
          value: false,
          squash: true
        }
      },
      controller: require('./app/controllers/detail.Controller').inject(angular.module('app', ['ui.router', require('angular-sanitize')]))
    },

quiz1.Controller.js :(构建数据的父控制器)

function buildData(resp) {
  $scope.slides = [];

  for (var item in resp.quiz_slides) {
    if (resp.quiz_slides) {
      $scope.slides.push(resp.quiz_slides[item]);
    }
  }
}

detail.Controller.js :(断点错误的部分):

$scope.slide = $scope.slides[$stateParams.page];

问题:

当我使用QUIZ1.detail导航出$state.go('QUIZ2')并最终进入QUIZ3.detail页面时,我得到:

angular.js:14328 TypeError: Cannot read property '0' of undefined

这与$ stateParams.page(用于导航)有关,我认为它没有正确重置,因为旧数据可能仍在$ scope中。

我知道,因为立即导航到QUIZ3会解析数据并且没有错误。

有没有人有这方面的经验?

1 个答案:

答案 0 :(得分:0)

好的,如果有人想知道我是如何解决这个问题的,那么把它放到这里和那里然后播放给同事,我想:" $ root;用于幻灯片"!

注意: 命名约定与答案略有不同,但您明白了。

我在状态之间引入了一个init状态,这样它就可以正确地解析json的东西并将状态抛出到一个名为.detail的新子节点中: 的 INIT-state.js:

{{1}}