Итак, чего я пытаюсь достичь, так это иметь возможность добавить директиву, содержащую синтаксический анализатор, через другую директиву. При прямом добавлении директивы парсера к элементу html она работает полностью нормально. директива парсера, которую я сейчас использую:

.directive('parseTest', [
    function () {
        return {
            restrict: 'A',
            require: ['ngModel'],
            link: {
                post: function (scope, element, attributes, ctrls) {
                    var controller = ctrls[0];
                    controller.$parsers.unshift(function (value) {
                        var result = value.toLowerCase();
                        controller.$setViewValue(value);
                        controller.$render();

                        return result;
                    })
                }
            }
        }
    }
])

Теперь, когда я добавляю эту директиву через другую директиву, парсер никогда не вызывается достаточно странно. Директива, создавшая директиву parsetest:

.directive('generateTest', ['$compile',
    function ($compile) {
        return {
            restrict: 'A',
            compile: function (elem, attrs) {

                elem.attr('parse-test', '');
                elem.removeAttr('generate-test');
                var linkFn = $compile(elem);
                return function (scope, element, attr) {
                    linkFn(scope);
                }
            }               
        }
    }
])

Следующее работает нормально:

<input class="form-control col-sm-6" ng-model="model.parsetest" parse-test/>

Следующее не работает (хотя сгенерированный результат html такой же)

<input class="form-control col-sm-6" ng-model="model.generateTest" generate-test />

Итак, у меня вопрос: как заставить работать парсер, если он находится в динамически добавляемой директиве?

Обратите внимание, я уже пробовал решение аналогичной проблемы из этого вопроса, но это не работает для меня.

РЕДАКТИРОВАТЬ: Вот plnkr, который демонстрирует проблему, оба поля имеют синтаксический анализ к нему применена директива, которая должна сделать значение в нижнем регистре модели, но она работает только для той, которая не добавляется динамически, как показано в журналах консоли.

0
bramve 5 Янв 2018 в 12:11

1 ответ

Лучший ответ

Итак, я нашел решение, так что для всех, кто сталкивается с той же проблемой, вот оно.

Два небольших изменения необходимо внести в директиву, которая генерирует директиву, содержащую синтаксический анализатор или средство форматирования. Во-первых, установите приоритет директивы на число больше или равное 1. Во-вторых, установите для терминала значение true. Эти 2 настройки, похоже, решают проблему. Проблема, вероятно, заключается в том, что выполнение вложенных директив по умолчанию приводит к тому, что синтаксический анализатор и средства форматирования вставляются немного поздно, поэтому нам нужно убедиться, что директива сгенерирована в первую очередь, прежде чем что-либо еще.

Это всего лишь предположение, почему это работает, но если у кого-то есть объяснение, это было бы здорово :)

Что касается кода, директива, генерирующая другую директиву, должна выглядеть примерно так:

directive('generateTest', ['$compile',
    function ($compile) {
        return {
            restrict: 'A',
            terminal: true,
            priority: 1,
            compile: function (elem, attrs) {

                attrs.$set('parseTest', '');
                attrs.$set('generateTest', undefined);
                var linkFn = $compile(elem);
                return function (scope, element, attr) {
                    linkFn(scope);
                }
            }               
        }
    }
])
0
bramve 11 Янв 2018 в 21:37