【发布时间】:2015-02-27 16:35:45
【问题描述】:
我正在编写一个 AngularJS 应用程序,但我正在努力使其模块化。
我有一个包含大量输入的表单。对于每一个我都必须重复很多代码。这是一个例子:
<div class="row">
<div class="col-lg-6 col-lg-offset-3
col-md-6 col-md-offset-3
col-sm-12 col-xs-12">
<div class="input-group">
<span class="input-group-addon">Device Category</span>
<input
type="text"
class="form-control"
autocomplete="off"
ng-model="device.category"
>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6 col-lg-offset-3
col-md-6 col-md-offset-3
col-sm-12 col-xs-12">
<div class="input-group">
<span class="input-group-addon">Device Template</span>
<select
class="form-control"
ng-model="device.characteristics"
ng-change="copyDeviceTemplate(device)"
ng-options="opt as opt.label for opt in templateDevices"
>
</select>
</div>
</div>
</div>
如您所见,大量代码重复。因此,我考虑创建自己的指令。如果成功,上面的两个示例将用 HTML 编写如下:
<div device-input label="Device Category">
<input
type="text"
class="form-control"
autocomplete="off"
ng-model="device.category"
>
</div>
<div device-input label="Device Template">
<select
class="form-control"
ng-model="device.characteristics"
ng-change="deepCopyDeviceTemplate(device)"
ng-options="opt as opt.label for opt in templateDevices"
>
</select>
</div>
问题是我无法理解如何使这样的指令起作用。我只有这个:
angular.module("myApp").directive('deviceInput', [ function () {
return function(scope, element, attributes) {
var label = attributes['label'];
var htmlText = '<div class="row">' +
'<div class="col-lg-6 col-lg-offset-3 col-md-6 col-md-offset-3 col-sm-12 col-xs-12">' +
'<div class="input-group">' +
'<span class="input-group-addon">' + label + '</span>' +
// Something here to add whatever is inside the <device-input> div
'</div></div></div>';
element.replaceWith( htmlText );
};
}]);
这是我想做的,但我不知道如何在我的设备输入中添加任何内容。你有什么建议吗?有没有更好的方法来实现这一点?
【问题讨论】:
-
Enzey 提供了一个很好的答案,我尝试过使用它。但是,它并不完全有效,因为输入的值没有存储在模型中。我想这是范围绑定的问题......有什么建议吗?
标签: javascript angularjs twitter-bootstrap templates angularjs-directive