2015-10-20 85 views
0

我正在尝试在AngularJS和RequireJS中使用angular-ui-grid。见plunker hereAngularJS + RequireJS + angular-ui-grid

我的index31.html有grid和indexController.js定义gridOptions对象。 indexController在需要时被注入。

当index31.html之前,浏览器加载indexController.js,它工作正常(显示即网格),但是当它是倒过来,我得到错误:$scope.uiGrid is undefined.

如何指定(在$ stateProvider配置或其他地方)始终在index31.html之前加载indexController.js。或者,如何在HTML之前加载所有控制器?

+0

你plunker链接不工作 – Cyberdelphos

+0

@Cyber​​delphos谢谢,我已经更新了。在这里也加入.. http://plnkr.co/edit/5P2GAxIdPNbC5EvcKn4h – JeeAyez

回答

0

这样做的原因是,你有一个内嵌require需要控制的实际代码以异步方式,即:

// app.js 
define(function() { 
    ... 
    app.controller('IndexController', ['$scope', '$injector', function ($scope, $injector) { 
     // HERE!!! 
     require(['indexController'], function (controller) { 
      $injector.invoke(controller, this, { '$scope': $scope }); 
     }); 
    }]); 
}); 

有加载与此模式的顺序不能保证。

你可以做的:要求的'indexController'顶部:

define(['indexController'], function (indexController) { 
    ... 
    app.controller('IndexController', indexController); 
}); 

甚至消除了$injector的(恐怖IMO)用法!

(旁注:这样做,普拉克抱怨的indexController.js最后一行$scope.$apply();我评论它,它确实似乎是多余的)

普拉克:http://plnkr.co/edit/fsyljR8FEeZdvXB3SRJP?p=preview

+0

谢谢@Nikos。通过这样做,我需要在定义角度应用程序模块之前加载所有的控制器。我试图只在需要的时候加载控制器,以避免加载那些用户可能不需要的控制器(比如,由于他的授权级别或者他可能永远不会打开的某些页面)(我有一个大到中等大的大小的应用程序,所以限制下载的内容也是有意义的)。这就是为什么我采用异步加载控制器的方法。有什么不同的,更好的方法来实现我的目标? – JeeAyez

+0

请参阅[angular-require-lazy](https://github.com/nikospara/angular-require-lazy)进行延迟加载 - 这是我遇到的问题,还有其他问题。 –

+0

但是,如果你想以这种方式延迟加载控制器:(1)'indexController'在'ui-view'之外 - 无论如何它应该可以被加载。 (2)对于* view *控制器,您仍然可以使用状态的'resolve'属性延迟加载它们。所以,在'resolve'中,你返回一个promise,当'require'获取控制器的时候它会被解析。 –