2013-05-14 51 views
12

一般來說,我會做以下,並會有一個ng-app在我的HTML:因爲我只使用手動自舉AngularJS,然後讓模塊

var myApp = angular.module("myApp", []); 

myApp.controller("AttributeCtrl", function ($scope) { 
    $scope.master = { 
     name: "some name" 
    }; 
}); 

不過,我需要手動引導角它在我的應用程序的一部分,通過jQuery的$.load()加載。如果我做到以下幾點:

main.js - 這是那裏的頁面我想用在

$("#form").load(contextPath + url, params, function() { 
    angular.bootstrap($("#angularApp")); 
}); 

被拉出然後在網頁中都有它自己的JavaScript被拉到角:

function AttributeCtrl($scope) { 
    $scope.master = { name: "some name"}; 
} 

但是,理想情況下,我希望我的控制器在模塊級別作用域。所以我修改了上面的代碼,像這樣

main.js

$("#form").load(contextPath + url, params, function() { 
    angular.bootstrap($("#angularApp", ["myApp"])); 
}); 

然後......

var app = angular.module("myApp"); // retrieve a module 

app.controller("AttributeCtrl", function($scope) { 
    $scope.master = { name: "some name"}; 
}); 

檢索這種方式似乎不工作模塊,雖然。難道我做錯了什麼?

+0

您是否收到找不到模塊的消息?模塊聲明和控制器工廠是否在引導函數調用之前運行? – BoxerBucks 2013-05-14 14:13:54

+1

@gregg只是給你更新。他們更新了文件以明確說明。他們說你只能通過預定義的模塊。希望能幫助到你。 https://github.com/angular/angular.js/issues/3692 – zsong 2013-09-05 14:43:42

+0

如何保證執行加載所花的時間,以及在此時引用模塊引導的模塊的時間? – 2013-11-07 06:17:52

回答

1

我不知道,如果這只是你在這裏的示例代碼,但是:

angular.bootstrap($("#angularApp", ["myApp"])); 

應該

angular.bootstrap($("#angularApp"), ["myApp"]); 

您檢索模塊應該工作的代碼。

0

更新

他們更新的文件,現在它讀起來就像這個

數組中的每一項都應該是一個預定義的模塊的名稱或 (DI註釋)功能,將被噴射器調用作爲運行 塊。請參閱:{@link angular.module模塊}


這似乎是一個錯誤。

您實施檢索模塊的方式是正確。只是從文檔中引用它來明確說明,因爲它可能不是很出名。

當傳遞兩個或多個參數時,會創建一個新模塊。如果僅通過 一個參數,則檢索現有模塊(作爲模塊的第一個參數 傳遞的名稱)。

對於你提到的問題,長話短說...

bootstrap函數調用createInjector與模塊列表['ng', ['ngLocale', function(){...}] , 'myApp'](最後一個是你傳遞的模塊)

function bootstrap(element, modules) { 
    ... 
    var injector = createInjector(modules); 

裏面createInjector(),它要求loadModules

function createInjector(modulesToLoad) { 
    forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); }); 

通過每個模塊loadModules調用angularModule,初始化爲angularModule = setupModuleLoader(window);,創建對象window.angular.module

function loadModules(modulesToLoad){ 
    .... 
    var moduleFn = angularModule(module); // triggers the error 

的發生錯誤,因爲angularModule採用第二參數作爲requires。如果沒有它,它就會拋出一個異常,在這條線(行1148)throw Error('No module: ' + name);

報道:https://github.com/angular/angular.js/issues/3692

+0

這不是一個錯誤。你錯了。這是一個有效的plnkr http://plnkr.co/edit/UowJpWYc1UDryLLlC3Be?p=preview – vin 2013-08-22 18:39:36

+0

@vin讓我們把它剪掉。我不想和你爭論,因爲你真的不明白我們在這裏談論的是什麼。 – zsong 2013-08-22 18:41:25

+0

夠公平的,也許我不明白問題 – vin 2013-08-22 18:45:55

0

不知道這是否算作一個錯誤或執行判決(儘管一個看似可憐的一個)。添加一個空數組解決了你所遇到的未定義的require問題,並且應該解決你的整體問題。

var app = angular.module("myApp", []); // create a module 

app.controller("AttributeCtrl", function($scope) { 
    $scope.master = { name: "some name"}; 
});` 

另外,在你的小提琴你調用{{name}}這將不會呈現。你應該叫{{master.name}}


編輯

謝謝大家的downvotes。這裏是一個工作的例子。祝你好運!

http://plnkr.co/edit/UowJpWYc1UDryLLlC3Be?p=preview

+0

沒有。 「當傳遞兩個或多個參數時,會創建一個新模塊,如果僅傳遞一個參數,則會檢索現有模塊(作爲第一個參數傳遞給模塊的名稱)。」 – zsong 2013-08-22 01:32:06

+0

然後解決方案是創建一個新模塊,然後使用引導程序調用該模塊..'var app = angular.module('myApp',[]);' – vin 2013-08-22 18:22:17

3

你自舉程序後,您不能創建一個控制器。請參閱the documentation for angular.bootstrap

您應該在加載或定義模塊後調用angular.bootstrap()。在應用程序引導後,您不能添加控制器,服務,指令等。