Я пытаюсь выполнить встроенное редактирование в форме с помощью директивы Angular, к сожалению, я столкнулся с двумя проблемами, и я не могу их обойти, поэтому будет очень полезно второе мнение.

Вот скрипка: http://jsfiddle.net/jorgecas99/bc65N/

Вопрос 1: Как видите, я добавил раздел, который должен прослушивать нажатия клавиш (в данном случае клавишу esc) и выходить из режима редактирования, к сожалению, он не работает. Я попытался прослушать клавишу 13, которая является «вводом», и она сработала нормально, поэтому я не понимаю.

Вопрос 2: я хотел бы изменить второе поле на раскрывающееся, когда вы щелкаете его, чтобы редактировать его, не создавая новую директиву, возможно ли это? Я, конечно, забочусь о количестве строк кода, поэтому, если этого можно добиться с помощью одной директивы, то это будет моим предпочтительным вариантом.

Спасибо!

1
J Castillo 18 Окт 2012 в 02:37

1 ответ

Лучший ответ

Для первого вопроса вы можете увидеть исправленную версию вашей скрипки, которая включает технику, описанную в http: // css-tricks. com / snippets / javascript / save-contenteditable-content-changes-as-json-with-ajax / здесь http://jsfiddle.net/bonamico/cAHz7/

var myApp = angular.module('myApp', []);

Обратите внимание, что var myApp = отсутствовал, и поэтому следующее объявление не было выполнено

myApp.directive('contenteditable', function() {
return {
    require: 'ngModel',
    link: function(scope, elm, attrs, ctrl) {
        // view -> model
        elm.bind('blur', function() {
            scope.$apply(function() {
                ctrl.$setViewValue(elm.html());
            });
        });

        // model -> view
        ctrl.render = function(value) {
            elm.html(value);
        };

        // load init value from DOM
        ctrl.$setViewValue(elm.html());

        elm.bind('keydown', function(event) {
            console.log("keydown " + event.which);
            var esc = event.which == 27,
                el = event.target;

            if (esc) {
                    console.log("esc");
                    ctrl.$setViewValue(elm.html());
                    el.blur();
                    event.preventDefault();                        
                }

        });

    }
};

});

Смотрите также http://api.jquery.com/keydown/

Что касается второго вопроса, я бы предположил, что минимизация количества строк кода обычно не является основной проблемой, в то время как создание модульного и поддерживаемого кода - это так. Поэтому было бы определенно лучше создать две директивы и, возможно, общую функцию javascript для общих частей между ними, если таковые имеются.

4
Carlo Bonamico 31 Окт 2012 в 19:36
Ctrl. $ setViewValue (elm.html ()); в блоке if (esc) не требуется, потому что вы запускаете размытие и уже всегда делаете это в обработчике размытия
 – 
felixfbecker
14 Ноя 2015 в 03:29