我编写了一个组件,其中$ onInit检查$ state以设置一些变量。
在我的路由器配置中,我有:
azureml
在我的组件中,我正在做一些事情:
$stateProvider.state('app.students', {
abstract: true,
url: '/students'
});
$stateProvider.state('app.students.active', {
url: '/active',
component: 'listing',
data: {
tab: 'active'
}
});
运行应用程序时效果很好。
然而,来测试,我遇到了一个问题,我已经坚持了很久。这是我测试中所写内容的简化版本:
const vm = this;
vm.myStateName = $state.current.name;
vm.myStateData = $state.current.data;
但这永远不会被赋予任何东西。
如果我尝试在测试中记录let $state, $rootScope, componentCtrl = null;
beforeEach(angular.mock.inject((_$state_, _$rootScope_, $componentController) => {
$state = _$state_;
$rootScope = _$rootScope_;
componentCtrl = $componentController('listing', {
$scope: $rootScope.$new(),
$state: $state
});
}));
it('Should append the current model', () => {
$state.go('app.students.active');
$rootScope.$digest();
componentCtrl.$onInit();
expect(componentCtrl.data.tab).toEqual('active');
});
,我总是会遇到'空'类型状态,例如$state.current
经过大量研究后,我发现我不是唯一一个有这个问题的人,但没有关于这些线程的建议完全解决了我的问题: https://github.com/angular-ui/ui-router/issues/1627
是因为我的父母是一条抽象路线吗?如果是这样,我如何访问嵌套的子状态?
答案 0 :(得分:0)
尝试下面它肯定会起作用,因为它稍后会被填充并且浏览器会做出反应。尝试将带有$ state的块包含在$ timeout()中。在获取值之前等待$ digest周期结束是一个技巧。
$timeout(function() { console.log("******",$state.current.name); },1000);