Я новичок в 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);
});
}
};
});
Вы можете сделать это с помощью директивы:
в основном что-то вроде
//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>
data: "=data"
, но data
нигде не используются. Это что-то, что Angular подхватывает автоматически?
{{ title }}