AngularJS: передать $ scope в директиву

Попытка создать директиву загрузки файла с помощью плагина jQuery File Upload и этой сути директивы https://gist.github.com/gotitpalette/4726114

Мне нужно передать идентификатор объекта в profile-ctrl.js в функцию отправки для формы загрузки.

Моя директива находится вне контроллера, и я не мог установить объект в $ rootScope, чтобы поймать / передать его в директиве.

URL: в fileupload происходит волшебство. Вызов моего контроллера через api и передача информации о файле и, надеюсь, vendorId, который находится в объекте продавца в profile-ctrl.js. $scope.merchant

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

Моя директива:

//jqueryFileUpload-Plugin 
//https://github.com/blueimp/jQuery-File-Upload
define(['jquery',
        'angular',
        'core',
        'source/core/helpers/urlHelper.js'],
    function ($, angular, core, urlHelper) {
    "use strict";
    return [ function ($compile) {
        return {
            restrict:'E',
            scope: {
                merchant: '=ngModel'
            },
            compile:function(el,attrs, scope){
                var compiler = this,
                elem = el,
                vendorId = scope.merchant.id;
                instanceFn = function() {
                    var currentScope = this,
                        fileInputDiv = $(' <span class="btn btn-success fileinput-button">'+
                        '<i class="icon-plus icon-white"></i>'+
                        '<span>Upload Logo</span>'+
                        '<input type="file" name="files[]" single>'+
                        '</span>').appendTo(elem),
                        fileInput = fileInputDiv.find('input'),
                        fileList = $('<div class="UploaderList">'+
                        '<table>'+
                        '<tr>'+
                        '<td>File to Upload</td>'+
                        '</tr>'+
                        '</table>'+
                        '</div>').appendTo(elem),
                        button = $('<button class="btn">Submit</button>').appendTo(elem);

                    button.hide();
                    $('<div class="uploader">').appendTo(elem);
                    $('</div>').appendTo(elem);

                    fileInput.fileupload({
                        url:urlHelper.vendor.uploadLogo(vendorId),
                        dataType: 'json',
                        add:function (e, data) {

                            button.show();

                            // this will add a handler which will submit this specific file
                            button.bind('click.uploadsubmit', function(){ 
                                data.submit();
                            });
                            $.each(data.files, function (index, file) {
                                $("<tr><td>"+file.name+"</td><td></td><tr>").appendTo(fileList.find('table:first'));
                            });
                        },
                        // for each file
                        done: function (e, data) {

                            button.hide();

                            var result = "",
                                r = data.result,
                                file = data.files[0]; // we only support single file upload by now
                            // error

                            // CHANGE THIS PART FOR YOUR REQUIREMENTS (I have a json repsonse)

                            if(r.success !== undefined && r.success === false){
                                result = "<span class='error'>Unknown error</span>";
                                if(r.errors !== undefined && r.errors.length > 0 && r.errors[0].message !== undefined)
                                {
                                    result = "<span class='error'>"+r.errors[0].message+"</span>";
                                }
                            }
                            else{
                                result = "<span class='success'>OK</span>";
                            }

                            $("td:contains('"+file.name+"')").next().html(result);
                        },
                        progressall:function (e, data) {
                            var progress = parseInt(data.loaded / data.total * 100, 10);
                        },
                        // called only once... (wen submit button is clicked)
                        start:function(e){

                            // we start the upload, so we do also cleanup jobs right now:
                            button.unbind('click.uploadsubmit'); // importan - remove all event handlers
                            button.hide();
                            fileInputDiv.hide();

                        }
                    });

                };
                return instanceFn;
            }

        };
    }]; 
});

Директива вызова через HTML:

<jquery-File-Upload ng-model="merchant"></jquery-File-Upload>

Итак, прямо сейчас продавец возвращает undefined в директиве. Может ли кто-нибудь помочь мне передать это?


person Christopher Marshall    schedule 06.02.2013    source источник
comment
Третий аргумент функции компиляции - это не область видимости, а функция связывания с включением. Я считаю, что instanceFn, который вы определяете, является вашей функцией связывания, верно? Если это так, его первым аргументом является область действия, и на нем должен быть определен продавец.   -  person Mark Rajcok    schedule 07.02.2013
comment
Это правильно, хотя теперь я нахожу, что моя директива выполняется до того, как моя область действия продавца установлена ​​и, следовательно, не устанавливает значение. Проверено путем помещения scope.merchant.id в функцию запуска fileupload. Не стесняйтесь писать в качестве ответа:}   -  person Christopher Marshall    schedule 07.02.2013


Ответы (1)