データベース (私の場合は Firebase/angularFire) からのデータを使用してテンプレートを動的に構築したいと考えています。テンプレートが構築される方法は、angularFire で取得された各オブジェクト内のタグ プロパティによって異なります。私の最初のアプローチ:
var imgTemplate = function(tag){
return '<'+tag.tag+' class="{{ tag.classes }}" src="{{ tag.content }}" alt="{{ tag.alt }}">';
};
var txtTemplate = function(tag){
return '<'+tag.tag+' class="{{ tag.classes }}">{{ tag.content }}</'+tag.tag+'>';
};
これはほとんど機能しますが、tag.tag は実際のタグの代わりに定義されていません。これは、これらの関数を使用するコンパイル関数が angularFire がデータをフェッチしてバインドする前に実行されるためです。これが私の2番目のアプローチです:
var imgTemplate = function(tag){
return '<{{tag.tag}} class="{{ tag.classes }}" src="{{ tag.content }}" alt="{{ tag.alt }}">';
};
var txtTemplate = function(tag){
return '<{{ tag.tag }} class="{{ tag.classes }}">{{ tag.content }}</{{ tag.tag }}>';
};
ただし、これは txtTemplate のリテラル文字列の一部のみを繰り返しレンダリングします。
<{{ tag.tag }} class="{{ tag.classes }}">{{ tag.content }}
実際のhtmlの代わりにng-repeatで繰り返されるすべての「タグ」要素に対して。
これは私のディレクティブのコンパイル機能です:
compile: function(templateElem, directiveAttrs){
var tag = directiveAttrs.tag;
if(tag.tag === 'img'){
var img = angular.element(imgTemplate(tag));
templateElem.replaceWith(img);
}else{
var txt = angular.element(txtTemplate(tag));
templateElem.replaceWith(txt);
}
},
angular.ui.router の状態のコントローラーで Firebase からデータが取得されます。
.state("siteNav.sideNav.content", {
url: '/:lang/:view/:contentID/:index',
views:{
'@': {
templateUrl: '/views/content.html',
controller: function($scope, angularFire){
var stateParams = $scope.$stateParams;
console.log(stateParams.lang);
var url = 'https://example.firebaseio.com/'+stateParams.lang+'/content/'+stateParams.view+'/'+stateParams.contentID;
angularFire(new Firebase(url), $scope, 'tags');
}
}
}
}
テンプレート content.html は次のようになります。
<div ng-repeat="tag in tags">
<acms-view tag="tag"></acms-view>
</div>
- angularFire が提供する 3 方向バインディングが必要です。
- タグは firebase から取得する必要があり、代わりにリテラルを使用することはできません (最終バージョンでは、このタグは実際には何でもかまいません)。
コンパイル関数が比較/値の割り当てに使用する前に、「タグ」プロパティが設定されるようにするにはどうすればよいですか?
取得したデータをバインドするスコープがないため、コンパイル関数内で angularFire サービスを使用できません。
何らかの理由で angularFire はリンク関数内では機能しませんが、たとえ機能していたとしても、テンプレートを作成する必要があるため、あまり役に立たないと思います。
angularFire の代わりにコンパイル関数内で Firebase の js API を使用する必要がありますか?
もしそうなら、AngularFire が提供する 3 ウェイ バインディングを機能させるにはどうすればよいですか?
お時間をいただきありがとうござい
ます