0

機能を画像クロップ ライブラリ ( https://github.com/fengyuanchen/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 を除いて、init のパラメータは定義されていません。ただし、この一般的なパターンを使用する例をいくつか見てきました (例:ここ)。私は何を間違っていますか?

4

2 に答える 2

1

外部変数は、クロージャー コンテキストを介してアクセスできます。Chrome は、クロージャ コードで実際にアクセスされる変数のみを含めることによって、コンテキストを最適化しようとします。elementコードでアクセスされていないため、コンテキストの一部ではありません。これは、クロージャーで使用されていない変数を安全に破棄できることを意味するため、優れた機能です。

于 2015-11-12T21:14:06.957 に答える