我从angular-ui-router获得以下错误:
TypeError: Cannot read property '@' of null
...
TypeError: Cannot read property '@main' of null
...
我已经对可能导致此错误的原因进行了一些研究,并得出结论,问题在于,当条件为false时,我通过$ state.go(状态)进行重定向在另一个州的onEnter期间。
以下是关于github上同一问题的一些讨论:
我尝试了一些建议,但它们没有用。他们似乎没有提供解决方案,但只是指出问题,并根据this github讨论它应该解决,但我似乎无法让它工作。
我正在使用AngularJS v1.2.24和ui-router v0.2.11。
使用以下代码(简化):
.state('main', {
abstract: true,
url: '/main',
templateUrl: '/main/_layout.html'
})
.state('main.home', {
url: '/home',
templateUrl: '/main/home/home.html',
controller: 'HomeCtrl',
onEnter: function ($state)
{
if (condition === true){
$state.go('main.catch')
}
}
})
.state('main.catch', {
url: '/catch',
templateUrl: '/main/catch/catch.html',
controller: 'CatchCtrl'
})
有没有办法让它发挥作用?或者我应该考虑一种完全不同的方法来实现相同的结果吗?
P.S。:可能的解决方法是在控制器中执行以下操作,
$scope.$on('$stateChangeSuccess', function(){
// conditional redirect here
}
但我不想在HomeCtrl中这样做。
答案 0 :(得分:1)
我遇到了类似的情况,并用这种方式解决了:
Parse.Cloud.beforeSave(Parse.User, function (request, response) {
var user = request.object;
var key = user.get("recaptcha");
Parse.Cloud.httpRequest({
url: 'https://www.google.com/recaptcha/api/siteverify?secret=<ITS A SECRET>&response=' + key,
success: function (httpResponse) {
var status = JSON.parse(httpResponse.text).success;
console.log(status);
if (status === false) {
response.error();
} else {
response.success();
}
}
});
});
诀窍是你想让原始状态改变完成,而不是试图在状态改变的中间重定向。 $ timeout允许原始状态更改完成,然后立即触发更改到所需状态。
答案 1 :(得分:0)
$viewContentLoading
事件解决了这个问题:
$rootScope.$on('$viewContentLoading', function(){
if(!$state.$current.locals)
$state.$current.locals = {};
});