Я создаю слайд-шоу, используя AngularJS и Reveal.js. Для выявления требуется формаНаписание * wrapper * директива declarativly AngularJS
<div class="slides">
<section>
</section>
</div>
для горизонтальных слайдов. В то время как вертикальные горки имеют две секции:
<div class="slides">
<section>
<section>
</section>
</section>
</div>
Я рендеринга эту страницу с помощью углового:
<div ng-app='myApp' class="reveal">
<div class="slides" ng-controller='MyController'>
<section slide ng-repeat="slide in slides">
</section>
</div>
</div>
<script src="https://raw.github.com/hakimel/reveal.js/master/js/reveal.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js"></script>
</body>
</html>
Слайды с Mutiple шаги должны быть расположены вертикально. Все остальные должны быть горизонтальными. Контроллер возвращает шаги и настройки Reveal:
function MyController($scope) {
$scope.slides = [
{ 'steps': ['a'] },
{ 'steps': ['b1', 'b2'] },
{ 'steps': ['c1'] }
];
setTimeout(function() {
Reveal.initialize({
loop: false,
transition: Reveal.getQueryHash().transition || 'none'
});
}, .1 * 1000);
}
директива должна добавить новый элемент и атрибут вокруг шага. Вот мой некрасиво, неудобно, необходимо, как JQuery директивы:
app.directive('slide', function() {
var wrapContent = function (content) {
return '<h1>' + content + '</h1>';
};
return {
restrict: 'A'
,link: function (scope, element, attrs, controller) {
// resorting to imparative jQuery way
if (scope.slide.steps.length == 1) {
element.html(
wrapContent(scope.slide.steps[0])
);
} else {
var sections = '';
for (i=0,len=scope.slide.steps.length; i < len; ++i) {
sections +=
'<section ' +
function() {
result = '';
if (i !== len-1) {
result = 'data-autoslide="1000" ';
}
return result;
}() +
'>' +
wrapContent(scope.slide.steps[i]) +
'</section>';
}
element.html(sections);
}
}
}
});
Как я пишу это так, что она выглядит как угловой код? jsfiddle
Я пробовал компилировать, связывать, заменять, ng-switch все безрезультатно.
Инициализация 3-х сторонней библиотеки в конце ссылки устраняет глупую 'setTimeout'. Спасибо. OTOH, это все еще кажется более императивным, чем угловатым. – zhon
Определенно, необходимо, чтобы классический декларативный стиль вы видели в Angular. Но Reveal.js настолько специфичен для DOM, которого он ожидает, и логика для того, что делать, достаточно сложна, что я, вероятно, напишу ее таким образом в реальном проекте, так как считаю, что это более читаемо.(На самом деле я еще не создал декларативную версию этой директивы.) –