Ich bin ziemlich neu in Angular, so denke ich, Vorlage ist das falsche Wort. Hier ist was ich meine:Dynamisch laden in Angular Vorlage
Wir haben ein Rails-Backend, das Daten an ein Angular-Frontend liefert. Ich brauche eine ng-repeat
, um diese Daten zu zeigen. Das Problem ist, dass die gewünschte Vorlage Teil der Daten ist, die uns von Rails zur Verfügung gestellt werden. Hier ein Beispiel:
JSON serviert von Rails
[
{
data: {
title: "example title",
body: "example body"
},
template: "<h1>{{title}}</h1><p>{{body}}</p>"
},
{
data: {
body: "example body two"
},
template: "<div>{{body}}</div>"
}
]
Wir wissen nicht, wie viele Datensätze es wird, was die Vorlagen aussehen wird, oder welche Bindungen sie rufen für (Körper, Titel, Untertitel , etc). Ich kann die Vorlagen nicht lokal speichern, daher müssen alle Daten aus dem Rails-Backend stammen.
Hier ist Pseudo-Code von dem, was Ich mag würde erreichen:
<span ng-repeat="block in blocks">
<template src="block.template" data="block.data"></template>
</span>
Diese die angegebene Vorlage verwenden würde und bindet das data
Objekt zu.
Noch einmal, ich bin neu zu eckig, also wenn ich klären muss, lass es mich wissen. Vielen Dank!
EDIT: Hier ist mein Versuch einer Richtlinie. Es funktioniert nicht, da anscheinend template
keinen Zugriff auf die gewünschte Vorlage hat, die durch block.template
dargestellt wird. Dies würde nicht das Binden der Daten abdecken, also müsste ich das einarbeiten, sobald ich die Direktive festgelegt habe.
app.directive("template", function() {
return {
template: block.template,
scope: {
block: '=data'
},
restrict: 'E'
};
});
EDIT 2:
Hier ist ein weiterer Versuch, das nicht funktioniert. Dieser zeigt die Vorlage auf dem Bildschirm, sondern in der Konsole es Fehler, die 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);
});
}
};
});
Vielleicht die Verwendung von [** ngBindHtml **] (https://docs.angularjs.org/ api/ng/directive/ngBindHtml) wäre in diesem Fall nützlich. – developer033
@ developer033 Ich habe das probiert, aber es hat die Bindings wörtlich interpretiert, also hieß es '{{title}}' auf der Seite anstelle der gewünschten Daten –
Try * Direktiven * dann – developer033