gpt4 book ai didi

angularjs - 创建具有可变元素类型的指令

转载 作者:行者123 更新时间:2023-12-04 17:34:45 26 4
gpt4 key购买 nike

我正在尝试创建一个指令,通过使用“大”、“中”、“小”的下拉选择器来更改 html 元素类型 (h1/h2/h3)。我希望它也保留元素上的属性。我已经创建了这个例子的 fiddle :http://jsfiddle.net/H63Z3/1/

Angular :

angular.module('app', [])
.controller('example', function ($scope) {
$scope.type = 'h2';
})
.directive('changeType', function ($compile) {
return {
restrict: 'A',
link: function (scope, element, attributes) {
scope.$watch('type', function () {
var attrs = element[0].attributes;
var newElement = $('<' + scope.type + '>').text(element.text());
for (var i = 0; i < attrs.length; i++) {
newElement.attr(attrs.item(i).name, attrs.item(i).value);
}
element.replaceWith(newElement);
$compile(element.contents())(scope);
});
}
};
});

HTM & L:
<div ng-app="app" ng-controller="example">
<select ng-model="type" ng-options="k as v for (k,v) in { h1: 'Large', h2: 'Medium', h3: 'Small' }"></select>
<h1 change-type>Text</h1>

<div>{{ type }}</div>
</div>

我看到的问题是,在下拉列表进行更改后,元素属性没有在 Angular 中正确更新。似乎该指令没有重新应用于新元素。我不确定使用编译函数是否是正确的答案。

任何帮助将不胜感激。

最佳答案

我只是花了一点时间研究我决定称之为“变形”指令的东西。实际上这很有趣,我对结果非常满意。请注意,此解决方案是纯 Angular 解决方案。

备注 :当我第一次发布这篇文章时,我没有注意到您需要持久属性。我已经添加了该功能。我在编译后添加我的属性,但是如果您想将指令作为属性提供,则必须以相反的方式进行。

HTML

<h1>AngularJS 'Morphling' Directive</h1>
<div ng-app="app" ng-controller="morphTest">
<strong>Morphling directive type:</strong> <select ng-model="type" ng-options="tag as caption for (tag, caption) in { h1: 'Heading 1', h2: 'Heading 2', h3: 'Heading 3', li: 'List Item', quote: 'Quote', attrDemo: 'Attribute Persistence Demo' }"></select><br />
<morphling type="type" attr="value">Normal <span style="color: red">{{bindingDemo}}</span> Works</morphling>
</div>

较少的
html, body {
font-family: sans-serif;
color: #111;
}

quote {
display: block;
margin: 20px;
font-style: italic;
&:before,
&:after {
content: '"';
}
}

attrDemo[attr="value"] {
display: inline-block;
color: blue;
-webkit-transform: rotate(180deg);
-moz-transform: rotate(180deg);
-ms-transform: rotate(180deg);
-o-transform: rotate(180deg);
transform: rotate(180deg);
}

Javascript
angular.module('app', [])
.controller('morphTest', function ($scope) {
$scope.type = 'h2';
$scope.bindingDemo = 'Binding';
})
.directive('morphling', function ($compile) {
return {
restrict: 'E',
replace: true,
link: function(scope, element, attributes) {
var e = element;
scope.$watch(attributes.type, function(type){
type = !!type ? type : 'span';
var e2 = $compile('<' + type + '>' + e.html() + '</' + type + '>')(scope);
for(var a in attributes.$attr) {
if(a.toLowerCase() != 'type')
e2.attr(a, attributes[a]);
}
e.replaceWith(e2);
e = e2;
});
}
};
});

演示

CodePen Demo

关于angularjs - 创建具有可变元素类型的指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24920456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com