0

我正在尝试将ui-router与lazyload一起使用,从chrome我可以看到已加载所需的js,但角度会引发错误。

从错误中我可以看出控制器未初始化,附加了路由器代码:

var app = angular.module('aaaaa', ['oc.lazyLoad', 'ui.router']);

app.config(function($stateProvider, $urlRouterProvider) {
  $urlRouterProvider.otherwise('/pages/dashboard');

  $stateProvider.state('index', {
    url: '/pages/:name',
    templateUrl: function($stateParams) {
      return 'templates/' + $stateParams.name + '.html';
    },
    controllerProvider: function($stateParams) {
      return $stateParams.name;
    },
    resolve: {
      loader: ['$ocLazyLoad', '$stateParams', function($ocLazyLoad, $stateParams) {
        var url = 'templates/controllers/' + $stateParams.name + '.js';
        console.log(url);

        return $ocLazyLoad.load({
          name: 'aaaaa',
          files: [url]
        });
      }]
    }
  });
});

我错过了什么吗?

4

2 回答 2

0

问题已解决。

在单独的控制器文件中,你不能这样写,

app.controller ('xxx', [ ... ]);

相反,使用

angular.module('xxxx').controller ('xxx', [ ... ])

我还不知道为什么,但它奏效了。

于 2015-07-20T15:08:07.940 回答
0

我会重构你的resolve.loader功能:

loader: ['$ocLazyLoad', '$stateParams', function($ocLazyLoad, $stateParams) {
  var url = 'templates/controllers/' + $stateParams.name + '.js';

  return $ocLazyLoad.load(url).then(function () {
    return $stateParams.name;
  });
}]

现在,当 ocLazyLoad 成功加载您的控制器代码时,我们返回您的控制器的名称(我假设它的实际名称与 的名称匹配$stateParams.name,因为这就是您在 controllerProvider 中引用它的方式)。

然后在controllerProvider

controllerProvider: function (loader) {
  return loader;
}

controllerProvider现在接受解析的值,而不仅仅是 stateParams - 根据以下提交:ui-router#851f8e46

这被引入0.2.14再次更改,它现在也支持函数resolved中的值templateUrl

所以loaded顺便说一句,如果你升级到 0.2.15,你可以传入你的 templateUrl 函数,而不是 `$stateParams.name。一个价值来统治他们?


无论如何,我会事先在debugger您的函数顶部放置一条语句,以检查并确保它与函数内部的相同。见鬼。controllerProvider$stateParams.name$stateParams.nameresolve.loader


此外,查看抛出的错误、开发控制台输出以及控制器/模块的实现细节可能会非常有帮助。

于 2015-07-20T14:56:33.610 回答