Javascript AngularJS-如何更改包含数据绑定的模板中的元素?
建议在模板中使用动态标记名的最佳方式是什么 我有一个包含h1-h6标签的下拉列表。用户可以选择其中任何一个,内容将更改为由所选的标题标记(存储在$scope上)包装。内容绑定到模型,即{{}内 要持久化绑定,我可以更改标记并使用$compile。但是,这不起作用,因为在Angular将{{}替换为模型值之前(显然)会追加它。页面加载时是h3 例如:Javascript AngularJS-如何更改包含数据绑定的模板中的元素?,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,建议在模板中使用动态标记名的最佳方式是什么 我有一个包含h1-h6标签的下拉列表。用户可以选择其中任何一个,内容将更改为由所选的标题标记(存储在$scope上)包装。内容绑定到模型,即{{}内 要持久化绑定,我可以更改标记并使用$compile。但是,这不起作用,因为在Angular将{{}替换为模型值之前(显然)会追加它。页面加载时是h3 例如: <div id="root"> <h3 id="elementToReplace">{{ modelData }}&
<div id="root">
<h3 id="elementToReplace">{{ modelData }}</h3>
</div>
{{modelData}}
重新编译时,我尝试使用以下字符串:
<{{ tag }} id="elementToReplace">{{ modelData }}</{{ tag }}>
{{modelData}
有什么想法吗?
定义一个名为“tag”的范围变量,并将其绑定到选择列表和自定义指令
HTML:
H1
氢
H3
H4
H5
嘿
接下来,使用双向模型绑定将标记范围模型传递到指令中:
var app = angular.module('app',[]);
app.directive('tag', function($interpolate) {
return {
restrict: 'E',
scope: {
tagName: '='
},
link: function($scope, $element, $attr) {
var content = $element.html();
$scope.$watch('tagName', function(newVal) {
$element.contents().remove();
var tag = $interpolate('<{{tagName}}>{{content}}</{{tagName}}>')
({tagName: $scope.tagName, content: content});
var e = angular.element(tag);
$element.append(e);
});
}
}
});
var-app=angular.module('app',[]);
应用指令('tag',函数($interpolate){
返回{
限制:'E',
范围:{
标记名:'='
},
链接:函数($scope、$element、$attr){
var content=$element.html();
$scope.$watch('tagName',函数(newVal){
$element.contents().remove();
var标记=$interpolate(“{{content}}”)
({标记名:$scope.tagName,内容:content});
var e=角度元素(标签);
$element.append(e);
});
}
}
});
注意,在custom指令中,我们使用$interpolate服务根据在select列表中选择的标记生成HTML元素。$watch函数用于监视标记模型的更改,当它更改时,新元素将附加到DOM中
定义一个名为“tag”的范围变量,并将其绑定到选择列表和自定义指令
HTML:
H1
氢
H3
H4
H5
嘿
接下来,使用双向模型绑定将标记范围模型传递到指令中:
var app = angular.module('app',[]);
app.directive('tag', function($interpolate) {
return {
restrict: 'E',
scope: {
tagName: '='
},
link: function($scope, $element, $attr) {
var content = $element.html();
$scope.$watch('tagName', function(newVal) {
$element.contents().remove();
var tag = $interpolate('<{{tagName}}>{{content}}</{{tagName}}>')
({tagName: $scope.tagName, content: content});
var e = angular.element(tag);
$element.append(e);
});
}
}
});
var-app=angular.module('app',[]);
应用指令('tag',函数($interpolate){
返回{
限制:'E',
范围:{
标记名:'='
},
链接:函数($scope、$element、$attr){
var content=$element.html();
$scope.$watch('tagName',函数(newVal){
$element.contents().remove();
var标记=$interpolate(“{{content}}”)
({标记名:$scope.tagName,内容:content});
var e=角度元素(标签);
$element.append(e);
});
}
}
});
注意,在custom指令中,我们使用$interpolate服务根据在select列表中选择的标记生成HTML元素。$watch函数用于监视标记模型的更改,当它更改时,新元素将附加到DOM中 这是我弄来的,尽管你说你不想要;)
var-app=angular.module('app',[]);
app.controller('ctrl',['$scope',函数($scope){
$scope.modelData=“模型数据”+
“这是更改标记中的文本!
”;
$scope.tags=[“h1”、“h2”、“h3”、“h4”、“p”];
$scope.selectedTag=“p”;
}]);
应用程序指令(“标记选择器”,函数(){
返回{
resrict:'A',
范围:{
modelData:“@”,
已选择标记:“@”
},
链接:功能(范围、el、属性){
范围:$watch(“selectedTag”,updateText);
el.prepend(scope.modelData);
函数updateText(){
var tagStart=“”;
var tagEnd=“”;
$(“#替换”).replaceWith(tagStart+$(“#替换”).html()+tagEnd);
}
}
}
});
这是我弄到的一个,尽管你说你不想要;)
var-app=angular.module('app',[]);
app.controller('ctrl',['$scope',函数($scope){
$scope.modelData=“模型数据”+
“这是更改标记中的文本!
”;
$scope.tags=[“h1”、“h2”、“h3”、“h4”、“p”];
$scope.selectedTag=“p”;
}]);
应用程序指令(“标记选择器”,函数(){
返回{
resrict:'A',
范围:{
modelData:“@”,
已选择标记:“@”
},
链接:功能(范围、el、属性){
范围:$watch(“selectedTag”,updateText);
el.prepend(scope.modelData);
函数updateText(){
var tagStart=“”;
var tagEnd=“”;
$(“#替换”).replaceWith(tagStart+$(“#替换”).html()+tagEnd);
}
}
}
});
更洁净的版本。可以很好地使用ng repeat和嵌套指令。
工作示例
angular.module('myApp',[])
.directive('tag',function($interpolate,$compile){
返回{
优先:500,
限制:“AE”,
终端:是的,
范围:{
标记名:'='
},
链接:函数($scope$element){
$scope.$on(“$destroy”,函数(){
$scope.$destroy()
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<script src="../lib/jquery.js"></script>
<script src="../lib/angular.js"></script>
<script>
var app = angular.module('app', []);
app.controller('ctrl', ['$scope', function ($scope) {
$scope.modelData = "<h1>Model Data</h1>" +
"<p id='replace'>This is the text inside the changing tags!</p>";
$scope.tags = ["h1", "h2", "h3", "h4", "p"];
$scope.selectedTag = "p";
}]);
app.directive("tagSelector", function(){
return {
resrict: 'A',
scope: {
modelData: '@',
selectedTag: '@'
},
link: function(scope, el, attrs){
scope.$watch("selectedTag", updateText);
el.prepend(scope.modelData);
function updateText(){
var tagStart = "<" + scope.selectedTag + " id='replace'>";
var tagEnd = "</" + scope.selectedTag + ">";
$("#replace").replaceWith(tagStart + $("#replace").html() + tagEnd);
}
}
}
});
</script>
</head>
<body ng-app="app">
<div ng-controller="ctrl">
<select ng-model="selectedTag" ng-options="tag for tag in tags"></select>
<div tag-selector selected-tag="{{selectedTag}}" model-data="{{modelData}}"></div>
</div>
</body>
</html>
angular.module('myApp', [])
.directive('tag', function($interpolate, $compile) {
return {
priority: 500,
restrict: 'AE',
terminal: true,
scope: {
tagName: '='
},
link: function($scope, $element) {
$scope.$on('$destroy', function(){
$scope.$destroy();
$element.empty();
});
$scope.$parent.$watch($scope.tagName, function(value) {
$compile($element.contents())($scope.$parent, function(compiled) {
$element.contents().detach();
var tagName = value || 'div';
var root = angular.element(
$element[0].outerHTML
.replace(/^<\w+/, '<' + tagName)
.replace(/\w+>$/, tagName + '>'));
root.append(compiled);
$element.replaceWith(root);
$element = root;
});
});
}
}
})
.controller('MyCtrl', function($scope) {
$scope.items = [{
name: 'One',
tagName: 'a'
}, {
name: 'Two',
tagName: 'span'
}, {
name: 'Three',
}, {
name: 'Four',
}];
});
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<tag class="item" tag-name="'item.tagName'" ng-repeat="item in items">
{{item.name}}
</tag>
</div>
</div>