如何将数据库中的 html 标签注入到我的指令的模板中,实际上是动态定义模板的根元素/标签
How to inject an html tag from database into my directive's template, in effect dynamically defining the root element/tag of the template?
我想用数据库中的数据动态构建一个模板(在我的例子中是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获取和绑定数据之前运行。这是我的第二种方法:
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 }}
对于每个使用 ng-repeat 而不是实际 HTML 迭代的"标签"元素。
这是我的指令的编译函数:
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');
}
}
}
}
模板内容.html如下所示:
<div ng-repeat="tag in tags">
<acms-view tag="tag"></acms-view>
</div>
- 我确实需要 angularFire 提供的三向绑定。
- 标签必须来自 firebase,不能使用文字代替(在最终版本中,这个标签可以是任何东西)。
如何确保在编译函数将其用于比较/值分配之前填充"tag"属性?
不能在编译函数中使用 angularFire 服务,因为没有将获取的数据绑定到的范围。
由于某种原因,angularFire 在链接功能中不起作用,尽管即使是这样,我认为它也不会有太大帮助,因为我仍然需要构建模板。
我应该在编译函数中使用Firebase的js api而不是angularFire吗?
如果是这样,我将如何使 angularFire 提供的三向绑定工作?
谢谢你的时间
杰瑞德
您可以使用
$q
创建承诺,并将$scope.tags
设置为承诺,该承诺将在angularFire
获取数据时返回数据。例如:
.state("siteNav.sideNav.content", {
url: '/:lang/:view/:contentID/:index',
views:{
'@': {
templateUrl: '/views/content.html',
controller: function($scope, $q, angularFire){
var stateParams = $scope.$stateParams;
var url = 'https://example.firebaseio.com/'+stateParams.lang+'/conten /'+stateParams.view+'/'+stateParams.contentID;
var deferred = $q.defer();
$scope.tags = deferred.promise;
angularFire(new Firebase(url), $scope, 'rawTags').then(function() {
deferred.resolve($scope.rawTags);
});
}
}
}
}
相关文章:
- 在<页眉>标签
- Ckeditor-plugin:插入虚假元素add不情愿<p>标签前后
- iframe正在添加标签,需要删除它们
- 如何自动调整标签的高度以适应内容
- Jquery标签插件粘贴问题
- Twitter引导程序Typeahead-Id&标签
- Highcharts-如何在自定义格式化程序中获得默认的y轴标签格式化程序
- Morris.js折线图x轴标签在调整大小后消失
- JavaScript goto 标签如何使用内部循环
- 显示某个用户ID的某个标签的30张Instagram图片
- 标签客户端的设置值
- 谷歌图表显示所有标签
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 如何在图片和边缘之间居中设置标签
- 在Datatables中设置本地化后,需要更改标签文本
- 第二组标签及其内容赢得'默认情况下t加载
- 在一个javascript文件中为整个网站创建标签
- 兰吉 |如何在 span 标签上使用单击事件删除突出显示的文本
- Knockout.JS标签在foreach内部不起作用
- 如何将数据库中的 html 标签注入到我的指令的模板中,实际上是动态定义模板的根元素/标签