Кажется, не удается получить доступ к каким-либо параметрам, кроме allBindings в пользовательской привязке в событии, зарегистрированном с помощью registerEventHandler

У меня есть нокаутирующая настраиваемая привязка, которая переносит функциональность в библиотеку обрезки изображений (https://github.com/fengyuanchen/cropper .) Я перехватываю событиеcropend.cropper, чтобы (в конечном итоге) прикрепить обрезанный вывод к наблюдаемому.

Я использую:

  • нокаут 3.3
  • jquery 2.1.4
  • обрезка 2.0

Вот обработчик привязки:

    ko.bindingHandlers.cropper = {
        init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            var $element = $(element);
            var value = ko.unwrap(valueAccessor());
            var a = 1;
            ko.utils.registerEventHandler(element, "cropend.cropper", function (event) {
                var previewOutputObservable = allBindings.get('previewOutput');
                var valueAccessorFromAllBindings = allBindings.get('cropper');
                var b = 1;
            });
            $element.cropper(value);
        },
        update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
            var $element = $(element);
            var value = ko.unwrap(valueAccessor());
            var c = 1;
        }
    };

И вот элемент, к которому я привязываюсь:

<img class="img-responsive" data-bind="attr: {'src': sampleObservable}, cropper: { aspectRatio: 16/9 }, previewOutput: cropPreview "/>

Когда я ставлю точку останова (в хроме) на var b = 1; ни один из параметров в инициализации не определен, кроме allBindings. Я видел несколько примеров, использующих этот общий шаблон (например, здесь). Что я делаю не так?


person Maleki    schedule 12.11.2015    source источник


Ответы (2)


Внешние переменные доступны через контекст закрытия. Chrome пытается оптимизировать контекст, включая только те переменные, к которым фактически осуществляется доступ в коде закрытия. Поскольку в вашем коде не было доступа к element, он не является частью контекста. Это хорошая функция, поскольку она означает, что переменные, которые не используются ни в одном замыкании, могут быть безопасно удалены.

person Michael Best    schedule 12.11.2015

Это либо проблема с инструментами отладки Chrome, либо «особенность» нокаута.

Перед var b = 1 я добавил строку var newValue = element. Я поставил точку останова на этой строке, и вот, параметр элемента теперь имеет значения.

Кажется, что переменные не инициализируются, пока они не используются в текущем контексте.

person Maleki    schedule 12.11.2015