我正在为一个状态选择角度。它正在工作,但我花了一些时间试图找到一种方法来编译模板之前在DOM中。它目前的工作方式如下:
app.register.directive('stateDropdown', ['StatesFactory', '$compile', function (StatesFactory, $compile) {
function getTemplate(model) {
var html = '<select ng-model="' + model + '" ng-options="state.abbreviation as state.name for state in states" class="form-control"></select>';
return html;
}
function link (scope, element, attrs) {
scope.states = StatesFactory.States;
element.html(getTemplate(attrs.stateModel));
$compile(element.contents())(scope);
}
return {
replace: true,
link: link
}
}]);
但是就这样它将模板插入到元素中然后根据范围进行编译。有一个更好的方法吗?比如在模板插入之前编译模板?
答案 0 :(得分:3)
抓我以前的所作所为。
[编辑2]
使用动态模型有点问题,试图将其纳入正常的Angular工作流程。 相反,您需要手动编译指令中的模板,但在执行此操作之前添加ng-model,您还需要使用构建的模板管理现有元素的替换。
module.directive('stateDropdown', function (StatesFactory, $compile) {
var template = '<select ng-options="state.abbreviation as state.name for state in states" class="form-control"></select>';
return {
scope: true,
controller: function($scope) {
$scope.states = StatesFactory.states;
},
compile: function($element, $attrs) {
var templateElem = angular.element(template).attr('ng-model', '$parent.' + $attrs.stateModel);
$element.after(templateElem);
$element.remove();
var subLink = $compile(templateElem);
return {
pre: function(scope, element, attrs) {
subLink(scope);
},
post: function(scope, element, attrs) {
}
}
}
};
});
可以在此处找到这方面的工作示例:http://jsfiddle.net/u5uz2po7/2/
该示例使用隔离范围,以便应用“状态”。范围不会影响现有范围。这也是“父母”的原因。&#39;在ng模型中。