gpt4 book ai didi

angularjs - 如何将 Angular 指令存储在范围变量中?

转载 作者:行者123 更新时间:2023-12-02 22:31:51 24 4
gpt4 key购买 nike

我正在 AngularJS 中实现一个表单生成器,需要在运行时插入和重新排序指令。甚至不知道从哪里开始寻找 - 所有示例似乎都只演示静态指令树。实现动态行为的两个选项是:a)动态编译和插入模板,b)使用所有可能指令的巨大 ng-switch。这两种方式都很丑陋。

有人可以建议更好的实现吗?

下面是 JS 和 html 代码,展示了我认为理想的 formbuilder 应该是什么样子,请帮我填写 3 个 TODO 实例。

JSFiddle JavaScript:

angular.module('components', [])
.directive('checkbox', function() {
return {
restrict: 'E',
template: '<div class=f><input type=checkbox>{{name}}</input></div>'
};
})
.directive('textfield', function() {
return {
restrict: 'E',
template: '<div class=f><input type=text placeholder="{{name}}"></input></div>'
};
})

function FormBuilder($scope, $locale) {
$scope.title = 'test form';
$scope.fields = [];
$scope.add_checkbox = function() {
console.log('adding checkbox');
var field = null; // TODO: how do I instantiate a directive?
$scope.fields.push(field);
};
$scope.add_textfield = function() {
console.log('adding textfield');
var field = null; // TODO: how do I instantiate a directive?
$scope.fields.push(field);
};
}

HTML:

<div ng-app=components ng-controller=FormBuilder>
<button ng:click="add_checkbox()">new checbox</button>
<button ng:click="add_textfield()">new text field</button>
<h3>{{ title }}</h3>
<checkbox></checkbox>

<textfield></textfield>

<div ng:repeat="field in fields">
<!-- TODO field.get_html() - how? -->
</div>
</div>

最佳答案

正如您所提到的,我认为您有几种方法可以做到这一点,并且由于您不想进行切换,因此您可以为每个指令创建一个模板文件。即 checkbox.html、textfield.html 并将指令放入每一个中。然后用 ['checkbox.html', 'textarea.html'] 填充您的字段数组当您添加到循环中时,您只需简单地 <div ng-include='field'></div>

这是一个演示:http://plnkr.co/edit/w6n6xpng6rP5WJHDlJ3Y?p=preview

您还可以创建另一个指令,在其中传递输入类型并将其注入(inject)模板中。这是一个演示,它允许您避免声明模板并让指令根据字段类型创建它们:

http://plnkr.co/jhWGuMXZTuSpz8otsVRY

<div ng:repeat="field in fields">
<master-field type='field'></master-field>
</div>

这个 master-field 指令只是根据 field 的值编译一个模板。

.directive('masterField', function($compile) {
return {
restrict: 'E',
replace:true,
transclude: true,
scope:{
type:'='
},
template: '<div></div>',
controller: function ( $scope, $element, $attrs ) {},
link: function(scope, element, attrs) {

element.append( $compile('<' + scope.type+ '/></' +scope.type + '>')(scope) );
}
};
})

关于angularjs - 如何将 Angular 指令存储在范围变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16340236/

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