【问题标题】:AngularJS + RequireJS + angular-ui-gridAngularJS + RequireJS + angular-ui-grid
【发布时间】:2015-10-21 15:52:03
【问题描述】:

我正在尝试将 angular-ui-grid 与 AngularJS 和 RequireJS 一起使用。请参阅 plunker here

我的 index31.html 有网格并且 indexController.js 定义了 gridOptions 对象。 indexController 在需要时注入。

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

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

【问题讨论】:

标签: angularjs requirejs angular-ui-router angular-ui-grid


【解决方案1】:

这样做的原因是您需要异步控制器的实际代码,即使用内联 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();我把它注释掉了,看起来真的是多余的。)

Plunk:http://plnkr.co/edit/fsyljR8FEeZdvXB3SRJP?p=preview

【讨论】:

  • 谢谢@Nikos。通过这样做,我需要在定义角度应用程序模块之前加载我的所有控制器。我试图仅在需要时加载控制器,以避免加载用户可能永远不需要的控制器(例如,由于他的授权级别或他可能永远不会打开的某些页面)(我有一个中到大大小的应用程序,因此限制下载的内容也是有意义的)。这就是我采用异步加载控制器的方法的原因。对于我想要实现的目标,是否有不同的更好的方法?
  • 查看 angular-require-lazy 了解延迟加载 - 这是我对问题的看法,还有其他问题。
  • 如果您想以这种方式延迟加载控制器: (1) indexControllerui-view 之外 - 无论如何它可能应该被急切加载。 (2) 对于 view 控制器,您仍然可以利用状态的resolve 属性延迟加载它们。因此,在resolve 中,您返回一个承诺,当require 获取控制器时,该承诺得到解决。
  • 谢谢!让我也试试这些选项。
猜你喜欢
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2018-07-29
相关资源
最近更新 更多