2

ディレクティブに渡された属性の値を取得できません。ディレクティブがどのように機能するかについての私の理解はおそらくこれと関係がありますが、これはスコープに関連する問題であると私は推測しています。

以下のコードを確認すると、属性がそのまま使用されていることがわかります。

display="contest.StyleBgImageMedia.filename" 

コンテスト.StyleBgImageMedia.filename のこの値は文字列であり、コントローラーからコンソールすることで存在することを確認しました。問題は、ディレクティブ リンク関数内でアクセスしようとすると、値を取得できず、属性名しか取得できないことです。

このディレクティブは、次のようにビューで使用されます。

<uploader class="pull-left" action="builder/uploadMediaFile" display="contest.StyleBgImageMedia.filename" data-file="style_bg_image_media_id"></uploader>

完全なディレクティブは以下に掲載されています。$observe を使用して表示属性の値をレンダリングしていることがわかりますが、これは機能していません。

app.directive('uploader', function($rootScope) {
    return {
        restrict: 'E',
        scope: {
            action: '@',
            display: '@display'
        },
        link: function(scope, elem, attrs) {
            elem.find('.fake-uploader').click(function() {
                elem.find('input[type="file"]').click();
            });

            scope.progress = 0;

            attrs.$observe('display', function(value) {
                if (value) {
                    scope.avatar = value;
                }
            });

            scope.sendFile = function(el) {
                var $form = jQuery(el).parents('form');
                if (jQuery(el).val() === '') {
                    return false;
                }

                $form.attr('action', scope.action);
                scope.$apply(function() {
                    scope.progress = 0;
                });

                $form.ajaxSubmit({
                    type: 'POST',
                    uploadProgress: function(event, position, total, percentComplete) {
                        scope.$apply(function() {
                            scope.progress = percentComplete;
                        });
                    },
                    error: function(event, statusText, responseText, form) {
                        $form.removeAttr('action');
                    },
                    success: function(responseText, statusText, xhr, form) {
                        var ar = jQuery(el).val().split('\\'),
                            filename =  ar[ar.length-1];

                        $form.removeAttr('action');
                        scope.$apply(function() {
                            scope.avatar = filename;
                        });

                        var response = jQuery.parseJSON(responseText);
                        $rootScope.$broadcast('file-uploaded', {
                            'model': attrs.file,
                            'file': response.message
                        });
                    }
                });

            };
        },
        replace: false,
        templateUrl: 'builder/views/partials/upload.php'
    };
});
4

1 に答える 1