Я новичок в Angular, но я хорошо знаком с моим первым приложением. Это довольно сложно, поэтому я включил упрощенный пример для объяснения моей проблемы.
У меня такой угловой шаблон;
<html>
<head>
...
</head>
<body ng-controller="MyController">
<h1>My Template</h1>
<ol id="menu">
<li ng-repeat="section in sections" ng-click="goTo($index)">{{section.name}}</li>
</ol>
<div id="wrapper">
<?php echo $html; ?>
</div>
</body>
</html>
Идея состоит в том, что упорядоченный список будет действовать как меню, чтобы показать текущий раздел и скрыть все остальные. Мой PHP-скрипт создает разделы из существующего HTML, который выглядит так:
<section>
<h1>Page 1</h1>
<p>Some text here</p>
</section>
<section>
<h1>Page 2</h1>
<p>Text for page 2</p>
</section>
Я хотел бы как-то использовать Angular для выполнения следующего;
Думаю, конечный результат будет выглядеть следующим образом;
<html>
<head>
...
</head>
<body ng-controller="MyController">
<h1>My Template</h1>
<ol id="menu">
<li ng-repeat="section in sections" ng-click="goTo($index)">{{section.name}}</li>
</ol>
<div id="wrapper">
<section ng-if="currentSection == 1">
<h1>Page 1</h1>
<p>Some text here</p>
</section>
<section ng-if="currentSection == 2">
<h1>Page 2</h1>
<p>Text for page 2</p>
</section>
</div>
</body>
</html>
Я понимаю, что я мог бы сделать первую часть с некоторой заменой строки PHP, но я подумал, есть ли решение с угловым разрешением, как в реальном проекте, замена PHP невозможна.
Любые указатели были бы высоко оценены!
Я уверен, что есть более интересный ответ на этот вопрос, но пока, вот решение, которое я придумал;
Во-первых, функция для настройки моего навигатора - в основном находит все теги <section>
и для каждого, захватывает первое вхождение <h1>
, добавляя текст к привязке $ scope.sections. Это приводит к массиву строк, который мой ngRepeat может использовать для создания списка меню.
function setupNavigation() {
angular.forEach(angular.element(document.querySelectorAll('section')), function(value, key) {
$scope.sections.push(angular.element(value.querySelector('h1')).text());
});
}
Затем функция, которая привязана к ngClick моих повторных элементов списка. Он скрывает все разделы, прежде чем показывать соответствующий.
$scope.goTo = function(index) {
angular.element(document.querySelectorAll('section')).hide().eq(index).show();
}
Там будет более надежное решение, используя, вероятно, компиляцию и директивы $, но поскольку это только 2-й день обучения Angular, я думаю, что оставлю это на другой день!
Я бы немного изменил это. Во-первых, я отправил все данные разделов в приложение angularjs в виде массива JSON через вызов AJAX после загрузки страницы. Вы также можете выводить данные разделов как JSON непосредственно на страницу, а затем загружать эти данные в контроллер, но это будет менее эффективно для начального времени загрузки.
Обычно я делаю это с помощью фабрики AngularJS, чтобы вызывать определенный URL-адрес, который просто эхо-данные json_encoded и выход. Дополнительная информация о фабриках здесь http://viralpatel.net/blogs/angularjs-service-factory-tutorial/
После того, как вы поделились своими разделами как JSON, у вас должен быть массив, и каждый элемент в массиве должен быть объектом раздела с базовым information-, таким как имя и содержимое. Оттуда вы просто повторяете ng-repeat дважды:
В контроллере JS
// Init variables
$scope.location = 0; // set default
$scope.sections = []; // Create sections array
// Define function to 'go to' a section
$scope.goTo = function($index){
$scope.location = $index;
}
jQuery('#wrapper section').each(function(){
var name = jQuery('h2', this).first().text();
var content = jQuery('p', this).first().text();
var section = {name: name, content: content};
$scope.sections.push(section);
};
В HTML
<html>
<head>
...
</head>
<body ng-controller="MyController">
<h1>My Template</h1>
<ol id="menu">
<li ng-repeat="section in sections" ng-click="goTo($index)">{{section.name}}</li>
</ol>
<div id="wrapper">
<section ng-if="location == $index" ng-repeat="section in sections">
<h1>{{section.name}}</h1>
{{section.content}}
</section>
</div>
</body>
</html>