无法阅读财产' @'在onEnter中使用$ state时为null

时间:2015-02-19 10:11:35

标签: angularjs angular-ui-router

我从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中这样做。

2 个答案:

答案 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 = {};
});