Динамически загружать в угловой шаблон

0

Я новичок в Angular, поэтому считаю, что шаблон - неправильное слово. Вот что я имею в виду:

У нас есть бэкэнд Rails, обслуживающий данные в Angular frontend. Мне нужно использовать ng-repeat чтобы показать эти данные. Проблема в том, что желаемый шаблон приходит как часть данных, которые нам обслуживает Rails. Вот пример:

JSON, обслуживаемый Rails

[
  {
    data: {
      title: "example title",
      body: "example body"
    },
    template: "<h1>{{title}}</h1><p>{{body}}</p>"
  },
  {
    data: {
      body: "example body two"
    },
    template: "<div>{{body}}</div>"
  }
]

Мы не знаем, сколько будет записей, как будут выглядеть шаблоны или какие привязки они требуют (тело, заголовок, подпись и т.д.). Я не могу хранить шаблоны локально, поэтому все данные должны поступать из бэкэнда Rails.

Вот псевдокод того, что я хотел бы выполнить:

<span ng-repeat="block in blocks">
  <template src="block.template" data="block.data"></template>
</span>

Это будет использовать указанный шаблон и привязать к нему объект data.


Опять же, я новичок в угловой, поэтому, если мне нужно уточнить, дайте мне знать. Спасибо!

EDIT: Здесь моя попытка директивы. Он не работает, так как кажется, что template не имеет доступа к желаемому шаблону, представленному block.template. Это не затрагивало бы привязку данных, поэтому мне пришлось бы работать так, как только я исправил эту директиву.

app.directive("template", function() {
  return {
    template: block.template,
    scope: {
        block: '=data'
    },
    restrict: 'E'
  };
});

EDIT 2:

Здесь другая попытка, которая не работает. На этом показан шаблон на экране, но в консоли он scope.$watch is not a function ошибку scope.$watch is not a function

app.directive('template', function ($compile) {
  return {
    restrict: 'A',
    replace: true,
    scope: {
      tmpl: '=template'
    },
    link: function postLink(scope, element, attrs) {
      scope.$watch('tmpl', function (block) {
        element.html(block.template.blank_template);
        $compile(element.contents())(block.payload);
      });
    }
  };
});
  • 0
    Возможно использование ngBindHtml было бы полезно в этом случае.
  • 0
    @ developer033 Я пытался это сделать, но он буквально интерпретировал привязки, поэтому вместо нужных данных на странице было указано {{ title }}
Показать ещё 5 комментариев
Теги:
templates

1 ответ

0

Вы можете сделать это с помощью директивы:

в основном что-то вроде

//Assuming App is your Angular App Instance and Angular at least 1.4ish
app.directive('template',['$compile', function($c) {
      return {
         link: function (scope, el, attrs, controller) {
            el.html(scope.template);
            $c(el.contents())(scope);
         },
         scope: {
           template: "=tpl",
           data: "=data"
         }
      }
});

Затем вы можете использовать его так:

<span ng-repeat="block in blocks">
  <template tpl="block.template" data="block.data"></template>
</span>
  • 0
    Я не гарантирую, что это на 100% без ошибок, но это должно дать вам представление ...
  • 0
    Спасибо! Кажется, это не работает, но я поиграю и посмотрю, что я могу сделать. Вопрос: в объекте видимости вы пишете data: "=data" , но data нигде не используются. Это что-то, что Angular подхватывает автоматически?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню