在呈现模板之前编译指令

时间:2014-11-19 23:38:15

标签: angularjs angularjs-directive angularjs-compile

我正在为一个状态选择角度。它正在工作,但我花了一些时间试图找到一种方法来编译模板之前在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

        }
    }]);

但是就这样它将模板插入到元素中然后根据范围进行编译。有一个更好的方法吗?比如在模板插入之前编译模板?

1 个答案:

答案 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模型中。