' invocables'必须是一个对象

时间:2016-05-09 15:43:35

标签: angularjs

我的状态如下:

.state('core.recover', {
   url: '/recover',
   controller: 'RecoverPasswordCtrl',
   templateUrl: 'views/tmpl/recoverAccount/recover-password.html'
})

我希望当我在加载模板之前进入此状态检查某些内容时,在这种情况下我想调用一个api来检查一些东西,如果promise是成功的,它将继续并显示模板,否则它将重定向用户到另一个州。

我尝试在控制器的顶部执行此操作,但我总是看到模板片刻,然后重定向我,所以我尝试使用此帖子中的解决方法:

AngularJS | handle routing before they load

如下:

.state('core.recover', {
        url: '/recover',
        controller: 'RecoverPasswordCtrl',
        resolve: function(recoverAccountService, $location, $state, $q) {
          var deferred = $q.defer();
          deferred.resolve();
          recoverAccountService.get({email:$location.search().email, verificationKey:$location.search().verificationKey})
            .$promise.then(function (result) {}).catch(function (err) {
            $state.go("candidature.pre");
          });
          return deferred.promise;
        },
        templateUrl: 'views/tmpl/recoverAccount/recover-password.html'
      })

但它没有工作,我在浏览器的控制台中收到此错误:

Error: 'invocables' must be an object

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您没有使用正确的语法,resolve期望作为aimadResolver对象的条目,它将尝试评估哪个键。

让我们将您的解析功能缩写为var aimadResolver = function(recoverAccountService, $location, $state, $q) { var deferred = $q.defer(); deferred.resolve(); recoverAccountService.get({ email: $location.search().email, verificationKey: $location.search().verificationKey }) .$promise.then(function(result) {}).catch(function(err) { $state.go("candidature.pre"); }); return deferred.promise; } ,例如

state('core.recover', {
    url: '/recover',
    controller: 'RecoverPasswordCtrl',
    resolve: {'yourResolverName': aimaidResolver}
    },
    templateUrl: 'views/tmpl/recoverAccount/recover-password.html'
})

当然,这不是强制性的,但我是为了便于阅读而这样做。然后,您的州定义应如下所示:

yourResolverName

不要忘记在RecoverPasswordCtrl中注入recoverAccountservice.get(),否则您的控制器将无需等待即可实例化。资料来源:look for the resolve examples

侧面 我想指出你使用延迟对象没有意义。您将立即在函数的第二行解析延迟对象,这意味着RecoverPasswordCtrlrecoverAccountservice.get()已被实例化时仍可能处于暂挂状态。假设var aimadResolver = function(recoverAccountService, $location, $state, $q) { return recoverAccountService.get({... }) .then(function(result) { // do nothing? Apparently you only want to $state.go on a rejection of the promise }) .catch(function(err) { $state.go("candidature.pre"); return $q.when() }) } 返回一个promise(如果没有,你应该更改它),你可以更有效地写:

$q.when()

有关使用deferred与{{1}}的更多信息,请here