@kirill-93

Шаблоны на angularjs?

Здравствуйте, подскажите пожалуйста, как сделать следующее:
Мне приходит массив объектов - это шаблоны баннеров, у каждого баннера своя верстка, и в каждом баннере несколько товаров. В объектах приходит верстка шаблона и продукты, которые в эту же верстку нужно подставить. То есть примерно так:
var templates: [
  {
    "layout" : "<div><h1>{{layout name}}</h1><p ng-repeat='item in template.items'>{{item.name}}</p></div>",
    "items" : [
        {"name" : "item 1"},
        {"name" : "item 2"}
     ]
  }
];


Как сделать, чтобы в layout работали директивы ангуляра?
  • Вопрос задан
  • 317 просмотров
Решения вопроса 1
miraage
@miraage
Старый прогер
На коленке набросал (DEMO).

<!DOCTYPE html>
<html data-ng-app="app">

  <head>
    <script src="https://code.angularjs.org/1.3.15/angular.js"></script>
    <script>
      window.templates = [
        {
          "layout" : "<div><h1>{{name}}</h1><p ng-repeat='item in items'>{{item.name}}</p></div>",
          "name": "items",
          "items" : [
              {"name" : "item 1"},
              {"name" : "item 2"}
           ]
        }
      ];
    </script>
    <script src="script.js"></script>
  </head>

  <body>
    <div data-banner="items"></div>
  </body>

</html>


angular.module('app', [])

.config(function($provide) {
  $provide.constant('bannerTemplates', window.templates);
})

.directive('banner', function($compile, bannerTemplates) {
  return {
    // Изолируем scope
    scope: {},
    
    link: function(scope, elem, attrs) {
      // Ключ баннера
      var bannerName = attrs.banner,
          banner;
      
      // Находим объект баннера
      for (var i = 0, ii = bannerTemplates.length; i < ii; ++i) {
        // Сохраняем в переменную
        banner = bannerTemplates[i];
        
        // Если нашли - останавливаем цикл
        if (banner.name === bannerName) {
          break;
        }
      }
    
      // Добавляем данные в scope
      angular.extend(scope, banner);
      
      // Компилируем шаблон, получаем jQuery/jqLite объект
      var html = $compile(banner.layout)(scope);
      
      // Вставляем в контейнер
      elem.append(html);
    }
  };
});
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Kano
Вот более общее решение позволяющее просто подключить шаблон из scope plnkr.co/edit/MJlwYcJr6WFiULXP5SrX?p=preview
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы