Данный
Absolute Newbie to Angular, который хочет использовать концепцию "композиции", где Главная страница содержит множество небольших частей веб-страницы.
Я начал с создания только секции заголовка, как показано ниже, которая прекрасно связывается.
<html>
<body >
<div class="row" ng-app="HeaderModule" ng-controller="HeaderController">
<div class="col-lg-12">
<h1 class="page-header">
{{header.Title}}
</h1>
<ol class="breadcrumb">
<li class="active">
<i class="fa fa-dashboard">Some Data Here</i>
</li>
</ol>
</div>
</div>
</body>
</html>
<script src="../../lib/angular/angular.min.js"></script>
<script>
angular.module('HeaderModule', [])
.controller('HeaderController', ['$scope',
function ($scope) {
$scope.header = { "Title": "Pretty Good, We see the binding work if this page is alone, by itself" }
}])
</script>
Но Angular не хочет объявления mulitple ng-app, поэтому я удалил объявления HTML и Body и ng-app для заголовка.
<div class="row" ng-controller="HeaderController">
Главная страница выглядит так и работает отлично без заголовка. Первый Div объявляет приложение следующим образом.
<div id="wrapper" ng-app="TestResultsApp">
Логика JavaScript выглядит так.
angular.module('TestResultsApp', [])
.controller('CardsController', ['$scope',
function ($scope) {
$scope.results = {
'FirstCard': '12',
'SecondCard': '3',
'ThirdCard': '5',
'CardsSummary': '20'
}
}
])
Теперь я хочу добавить страницу заголовка, но, если возможно, по возможности держите логику контроллера, если это возможно. Или я мог бы также разделить JavaScript на файл, но все же хочу, чтобы ссылка была сделана на странице заголовка (основной принцип ответственности)...
Какой лучший способ сделать это?
Вот что я пробовал до сих пор:
Используя импорт HTML5 (веб-компоненты), я успешно вытащил на страницу заголовка, но Angular не может найти логику контроллера там. Если я вытащил объявление ng-app на странице заголовка, я не знаю, как создать только контроллер, который "втянут" в основное приложение ng-app (приложение)...
Пожалуйста, порекомендуйте.
Угловое будет автоматически загружать первое ng-app
оно находит. После этого вам нужно вручную загрузить ng-app
на странице.
Для рабочего примера см. Этот Plunker
angular.module('app1', []).controller('ctrl1', ['$scope', function ($scope) {
$scope.title = 'This is app1 ctrl1';
}]);
angular.module('app2', []).controller('ctrl1', ['$scope', function ($scope) {
$scope.title = 'This is app2 ctrl1';
}]);
angular.module('app3', []).controller('ctrl3', ['$scope', function ($scope) {
$scope.title = 'This is app3 ctrl1 title';
$scope.title3 = 'This is app3 ctrl1 title3';
}]);
angular.bootstrap(document.getElementById("app1"), ['app1']);
angular.bootstrap(document.getElementById("app2"), ['app2']);
angular.bootstrap(document.getElementById("app3"), ['app3']);
Но на самом деле, вероятно, это лучшая идея придерживаться одного ng-app
и использовать Angular Controllers вместе с директивами и компонентами для достижения того, что вы хотите сделать.
Честно говоря, если вам нужен шаблон, в котором вы смешиваете шаблон html для компонента и его javascript, вам может быть лучше смотреть на реакцию и JSX.
Тем не менее, если вы объявляете каждый из этих элементов в качестве директивы или компонента, вы можете сделать что-то вроде
angular.module('myApp') //note we're not declaring it here, just referencing it
.component('header', {
controller: function() { /* controller here */ }
template: '<div>{{$ctrl.foo}}</div>'
});
Если вы используете babel или имеете доступ к backticks, вы можете сделать многострочную строку довольно легко, которая выглядит довольно похоже на то, что вы хотите, она просто помещает html-шаблон внутри строки.
Затем вам просто нужно собрать все вместе в большой файл и предоставить точку входа.
Нашел ваш другой вопрос случайным образом. Проблема в том, что вы создаете два разных приложения. У вас есть angular.module('TestResultsApp', [])
и angular.module('HeaderModule', [])
. Вы должны использовать одно и то же приложение для обеих частей. Когда вы впервые подтвердили свое приложение, используйте angular.module('TestResultsApp', [])
, а затем в вашем контроллере используйте angular.module('TestResultsApp').controller(...)
. Это назначит контроллеру соответствующее приложение. Обратите внимание на отсутствие скобок во втором. Всякий раз, когда вы добавляете скобки, вы снова создаете Угловое выражение.