我有一個非常簡單的AngularJS SPA,使用UI路由器在兩個視圖之間切換。點擊主頁鏈接後,用戶將看到一行文字。關於鏈接也應該這樣做,但它的路由配置爲使用templateUrl而不是一個模板字符串:AngularJS UI路由器:何處包含控制器腳本
$stateProvider
.state("home", {
url: "/home",
template: "<h3>This is the Home content</h3>"
})
.state("about", {
url: "/about",
templateUrl: "about.html",
controller: "aboutController"
});
about.html是因爲它可以是一樣簡單:
<!DOCTYPE HTML>
<html ng-app="simpleApp">
<head>
<title>About</title>
<script src="aboutcontroller.js"></script>
</head>
<body ng-controller="aboutController">
<h3>{{message}}</h3>
</body>
</html>
。 ..和它的控制器也是純做作的樣板:
console.log("Registered aboutController"); ///////////
angular.module("simpleApp")
.controller("aboutController", ["$scope", function ($scope) {
console.log("Created aboutController"); ///////////
$scope.message = "This is the About content!";
}]);
注意兩個控制檯陳述,幫我診斷問題。
問題:當控制器腳本文件執行時,控制器本身永遠不會被調用。所以也看不到文本,用戶只要看到:
{{消息}}
這似乎是我包括在模板文件(有關該腳本文件中涉及到的事實。 HTML)。如果我將腳本標記移到index.html,問題就會消失,一切都按預期工作。
Here's a plunker that shows my problem and workaround.
真正的問題: 在這個非常簡單的和人爲的例子,它是合理的,包括在SPA的主要頁面的所有控制器的腳本。但即使是一個非常簡單的Web應用程序,也可能有幾十個頁面和數十個控制器。將所有控制器添加到主頁面並不能很好地提升性能,並且不能很好地進行維護。
那麼設置它的適當方法是什麼?控制器腳本應該如何/包括在哪裏?
編輯:我忘了提及我收到的錯誤(是的,我知道)。隨着about.html script標籤,我收到一條消息說
參數「aboutController」不是一個函數,得到了不確定
這直接發生在控制檯消息「註冊aboutController」之後。如果我將腳本標記移動到index.html中以包含控制器,則不顯示任何錯誤。同樣,對我來說,這表示控制器根本無法及時撥打電話。移動到index.html,它在需要時被完全註冊。
如果您在頁面上看到字面意思是「{{message}}」,那意味着該模板根本沒有被處理。如果Angular沒有處理模板,如果沒有填充「消息」,則只會看到任何內容。這指出產生致命錯誤的事物。你有沒有檢查你的Javascript控制檯的錯誤? – deceze
爲什麼你的模板包含整個HTML文件?它應該只包含與特定視圖相關的片段。你也不能在文件中使用'ng-controller',因爲你已經在路由器中使用'controller:...'了。您必須將帶有控制器的文件包含在您的主文件中,作爲您的主模塊的依賴項,否則路由器在嘗試加載您的路由時找不到控制器。 – deceze
@deceze我花了一些時間在plunker的readme.md文檔中製作了一個更完整的描述,並且忘記了在這裏提到錯誤。是的,有一個關於控制器不是一個函數的錯誤。這會在我的控制檯消息「Registered aboutController。」後直接顯示。如果我將腳本標記移至index.html,則消息將消失。所以即使註冊控制器的腳本及時執行,實際的控制器也不能被創建。我會把這個添加到問題中。感謝您指出。 –