2015-10-20 78 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'獲取控制器的時候它會被解析。 –