Angular UI 路由器 - 在子状态下共享控制器时为父级重置状态参数
Angular UI Router - State params reset for parent when sharing controller in child 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];
问题:
当我使用 $state.go('QUIZ2')
导航出 QUIZ1.detail
并最终进入 QUIZ3.detail
的页面时,我得到:
angular.js:14328 TypeError: Cannot read property '0' of undefined
这与 $stateParams.page(用于导航)有关,我认为它没有正确重置,因为旧数据可能仍在 $scope 中。
我知道这个 因为立即导航到 QUIZ3
将解析数据并且没有错误。
有没有人有这方面的经验?
好吧,如果有人想知道我是如何解决这个问题的,在把它放在这里和那里并播放给同事之后,我想:“幻灯片的 $rootScope”!
注意: 命名约定与答案略有不同,但你明白了。
我在状态之间引入了一个初始状态,以便它可以正确解析 json 内容并将该状态放入一个名为 .detail 的新子对象中:
init-state.js:
exports.inject = function (app) {
app.controller('sevenIntAFFECTinit.Controller', exports.controller);
exports.controller.$inject = ['$scope', '$state', '$stateParams', 'jsonPartialService', '$log', '$rootScope'];
return exports.controller;
};
exports.controller = function sevenIntAFFECTinitCtrl($scope, $state, $stateParams, jsonPartialService, $log, $rootScope) {
// Do the json in here. Jokes
$rootScope.slides = [];
jsonPartialService
.getJSON('part-1/7-INT-QUIZ-AFFECT')
.then(function (response) {
$scope.prevState = response.prev_state;
$scope.nextState = response.next_state;
$scope.quizTitle = response.quiz_title;
buildData(response);
});
function buildData(resp) {
for (var item in resp.quiz_slides) {
if (resp.quiz_slides) {
$rootScope.slides.push(resp.quiz_slides[item]);
}
}
$log.debug('after the slides have been pushed in init -->', $rootScope.slides);
$state.go('7-INT-QUIZ-AFFECT.detail', $stateParams, {reload: true, inherit: false});
}
};
我有一个控制器被两个子状态 (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];
问题:
当我使用 $state.go('QUIZ2')
导航出 QUIZ1.detail
并最终进入 QUIZ3.detail
的页面时,我得到:
angular.js:14328 TypeError: Cannot read property '0' of undefined
这与 $stateParams.page(用于导航)有关,我认为它没有正确重置,因为旧数据可能仍在 $scope 中。
我知道这个 因为立即导航到 QUIZ3
将解析数据并且没有错误。
有没有人有这方面的经验?
好吧,如果有人想知道我是如何解决这个问题的,在把它放在这里和那里并播放给同事之后,我想:“幻灯片的 $rootScope”!
注意: 命名约定与答案略有不同,但你明白了。
我在状态之间引入了一个初始状态,以便它可以正确解析 json 内容并将该状态放入一个名为 .detail 的新子对象中: init-state.js:
exports.inject = function (app) {
app.controller('sevenIntAFFECTinit.Controller', exports.controller);
exports.controller.$inject = ['$scope', '$state', '$stateParams', 'jsonPartialService', '$log', '$rootScope'];
return exports.controller;
};
exports.controller = function sevenIntAFFECTinitCtrl($scope, $state, $stateParams, jsonPartialService, $log, $rootScope) {
// Do the json in here. Jokes
$rootScope.slides = [];
jsonPartialService
.getJSON('part-1/7-INT-QUIZ-AFFECT')
.then(function (response) {
$scope.prevState = response.prev_state;
$scope.nextState = response.next_state;
$scope.quizTitle = response.quiz_title;
buildData(response);
});
function buildData(resp) {
for (var item in resp.quiz_slides) {
if (resp.quiz_slides) {
$rootScope.slides.push(resp.quiz_slides[item]);
}
}
$log.debug('after the slides have been pushed in init -->', $rootScope.slides);
$state.go('7-INT-QUIZ-AFFECT.detail', $stateParams, {reload: true, inherit: false});
}
};