如果您要在指令配置对象上使用模板属性,我猜您将失去查看原始文件的能力。
我认为要有效地做你正在做的事情,你需要使用我不精通的编译指令函数。我没有使用它来向你展示这个:
http://jsfiddle.net/2TPWA/
基本上为每个重要的数据创建指令。让他们共享一个控制器来注册所有这些数据。通过这样做,父指令可以使其子指令不一定是它的指定深度。隐藏(或删除,如果您愿意)原始标记,然后根据合并信息创建您的小部件。
在您的情况下,我会像您在此处看到的那样创建用于连接所有内容的指令,以及另一个指令,该指令本身就是小部件,可以使用属性或配置对象(如另一个回答者建议的那样)创建。
<div>
<div sliding-scale class="prompt scale">
<label sliding-scale-title for="mySelect">Temperature</label>
<select name="mySelect">
<option sliding-scale-option value="1">Cold</option>
<option sliding-scale-option value="2">Cool</option>
<option sliding-scale-option value="3">Neutral</option>
<option sliding-scale-option value="4">Warm</option>
<option sliding-scale-option value="5">Hot</option>
</select>
</div>
</div>
var myApp = angular.module('myApp', []);
myApp.directive('slidingScaleTitle', function () {
return {
require: '^slidingScale',
link: function (scope, element, attrs, controller) {
controller.setTitle(element.text());
}
};
});
myApp.directive('slidingScaleOption', function () {
return {
require: '^slidingScale',
link: function (scope, element, attrs, controller) {
controller.addOption({
value: attrs.value,
text: element.text()
});
}
};
});
myApp.directive('slidingScale', function ($compile) {
var template = '<div><b>{{ title }}</b><ul><li ng-repeat="o in options"><b>{{ o.value }}:</b> {{ o.text }} </li></ul>';
return {
// You should make this its own controller if you want this unit-tested.
// I'm inlining it as an example.
controller: function ($scope) {
var title;
var options = [];
this.setTitle = function (value) {
title = value;
};
this.getTitle = function () {
return title;
};
this.getOptions = function () {
return options;
}
this.addOption = function (value) {
options.push(value);
};
},
link: function (scope, element, attrs, controller) {
scope.$watch(controller.getTitle, function (value) {
scope.title = value;
});
scope.$watch(controller.getOptions, function (value) {
scope.options = value;
});
element.children().css('display', 'none');
fancySliderElement = angular.element(template);
element.append(fancySliderElement);
$compile(fancySliderElement)(scope);
}
}
});