web-dev-qa-db-ja.com

AngularJSでのjQueryファイルのアップロード

jQuery File Upload とangularJSを組み合わせてファイルをアップロードしようとしています。

私はマルチステップフォームを持っています、これは私のマルチステップフォームの2つのステップです:

<div ng-switch="step">
    <div ng-switch-when="1">
        <h1>Identity</h1>
        <form name="steponeForm" data-file-upload="options" enctype="multipart/form-data" novalidate autocomplete="off">
            <input type="submit" ng-click="next(steponeForm.$valid)" value="next" /><br>

            <span class="button fileinput-button" ng-class="{disabled: disabled}">
                <input type="file" id="fileupload" name="files[]" multiple="" >
            </span>
            <button type="button" class="btn btn-primary start" data-ng-click="submit()">
                <span>Start upload</span>
            </button>

            <input ng-model="application.lastName" string-pattern required type="text" placeholder="{{ 'Last name'|translate }} *" name="appname" id="appname" />
            <div ng-show="steponeForm.$submitted || steponeForm.appname.$touched">
                <div class="error" ng-show="steponeForm.appname.$error.required">Last name is required.</div>
                <div class="error" ng-show="steponeForm.appname.$error.stringPattern">Doesn't look like a text.</div>
            </div>

            <input type="submit" ng-click="next(steponeForm.$valid)" value="next" />
        </form>
    </div>

    <div ng-switch-when="2">
        <h1>Studies</h1>
        <form name="steptwoForm" novalidate autocomplete="off">
            <input type="submit" ng-click="previous()" value="previous" />
            <input type="submit" ng-click="next(steptwoForm.$valid)" value="next" />

            <fieldset class="input-group">
                <legend translate>Lower secondary studies</legend>
                <em>Last obtained degree</em>

                <input ng-model="application.LowerSecondaryStudies.degreeTitle" type="text" placeholder="Degree Title" name="moreLowerSecondaryStudies-degreetitle" id="lwsappdegreetitle" />
                <input ng-model="application.LowerSecondaryStudies.educationAuthority" type="text" placeholder="Education authority" name="moreLowerSecondaryStudies-educationauthority" id="lwsappeducationauthority" />
                <input ng-model="application.LowerSecondaryStudies.graduationYear" style="padding: 0.5278em; width: 100%;" type="number" min="1960" max="2015" value="2015" placeholder="Graduation year" name="moreLowerSecondaryStudiesgraduationyear" id="lwsappgraduationyear" />
                <div ng-show="steptwoForm.$submitted || steptwoForm.moreLowerSecondaryStudiesgraduationyear.$touched">
                    <div class="error" ng-show="steptwoForm.moreLowerSecondaryStudiesgraduationyear.$error.number">Must be valid year.</div>
                </div>
            </fieldset>

            <input type="submit" ng-click="previous()" value="previous" />
            <input type="submit" ng-click="next(steptwoForm.$valid)" value="next" />
        </form>
    </div>
</div>

私のカスタムjsファイルには次のものがあります。

jQuery('#fileupload').fileupload({
    dataType: 'json'
});

私のコントローラー(angularjs)には次のものがあります:

$scope.options = {
    maxFileSize: 5000000,
    type: "POST",
    acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i
};

ご覧のとおり、アップロードの開始時にsubmit()関数を呼び出しましたが、何もトリガーされません。また、ブラウザコンソールでエラーが発生しません。何が足りないのですか?

更新:

Controller.jsに送信機能がありません。これはjquery.fileupload-angular.jsで追加された標準だと思いました。また、送信関数を指定していません ここjQuery fileupload + anglejs.

app.jsでの私のモジュールの宣言:

var app = angular.module('dxs-vkgroupApp', ['ngRoute', 'gettext'])
.config(function($routeProvider, $httpProvider, $locationProvider){
    // send all requests payload as query string
    $httpProvider.defaults.transformRequest = function(data){
        if (data === undefined) {
            return data;
        }
        return jQuery.param(data);
    };

    // set all post requests content type
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';

    // all routes
    $routeProvider
        .when('/edit.php/submissions/', {
            templateUrl: viewsPath.views + 'submissions.html',
            controller: 'SubmissionOverviewController'
        })
        .when('/edit.php/submission/show/:fid/', {
            templateUrl: viewsPath.views + 'submission.html',
            controller: 'ShowSubmissionController'
        })
        .when('/edit.php/submission/delete/:fid/', {
            templateUrl: viewsPath.views + 'delete-submission.html',
            controller: 'DeleteSubmissionController'
        })
        .when('/wp-admin/', {
            controller: 'RouteDeciderController',
            template: '<div ng-include="getTemplateUrl()"></div>'
        })
        .when('/:l/submission/new/:jid', {
            templateUrl: viewsPath.views + 'new-submission.html',
            controller: 'StepController'
        })
        .when('/:l/projects/', {
            templateUrl: viewsPath.views + 'projects.html',
            controller: 'ProjectsOverviewController'
        }).otherwise({
            controller: 'RouteDeciderController',
            template: '<div ng-include="getTemplateUrl()"></div>'
        });

    $locationProvider.html5Mode(true);
})
.run(function (gettextCatalog, $location) {
    var curr_path = $location.path();
    var result = curr_path.split("/");
    var language = result[1];

    gettextCatalog.setCurrentLanguage(language);
    gettextCatalog.debug = true;
});

私のcontroller.jsには、とりわけ次のものがあります。

/**
 * Deals with advancing, going back or finishing the multi step form
 *
 * @param $scope
 * @param $http
 * @param $routeParams
 * @constructor
 */
function StepController($scope, $http, $routeParams)
{
    // inits
    $scope.application = {};
    $scope.application.children = [];

    // counters
    $scope.childCounter = 0;
    $scope.moreLowerSecondaryStudiesCounter = 0;
    $scope.moreHigherSecondaryStudiesCounter = 0;
    $scope.moreHigherShortTermEducationCounter = 0;
    $scope.moreHigherLongTermEducationCounter = 0;
    $scope.moreAdditionalStudiesSpecialtyCounter = 0;
    $scope.moreAdditionalStudiesThesisCounter = 0;
    $scope.languageCounter = 0;
    $scope.experienceCounter = 0;

    // select options
    $scope.languageOptions = ['--select--', 'very good', 'good', 'notions', 'no notion'];

    // languages
    // @todo make the default list dynamic instead of hardcoded (problem is, the variable expressions wont get accepted in the select attributes)
    //$scope.languages = ['dutch', 'french', 'english', 'german'];

    $scope.job_id = $routeParams.jid;

    $scope.step = 1;

    $scope.noneSelected = function (type) {
        switch(type)
        {
            case 'appcontact':
                    if(!$scope.application.contact){
                        return true;
                    }
                    else
                    {
                        return !($scope.application.contact.relations || $scope.application.contact.employees || $scope.application.contact.jobad || $scope.application.contact.website || $scope.application.contact.other)
                    }
                break;
            case 'appworklocation':
                    if(!$scope.application.worklocation){
                        return true;
                    }
                    else
                    {
                        return !($scope.application.worklocation.roeselare || $scope.application.worklocation.brussel || $scope.application.worklocation.merelbeke)
                    }
                break;
        }
    };

    $scope.next = function($valid){
        if(!$valid)
        {
            $scope.step = $scope.step;
        }
        else if($scope.step == 2)
        {
            $scope.inputgrouperror = false;

            // special check for 6 input groups (input fields)
            if(check())
            {
                $scope.step += 1;
            }
            else
            {
                $scope.inputgrouperror = true;
                $scope.step = $scope.step;
            }
        }
        else
        {
            $scope.step += 1;
        }

        window.scrollTo(0,0);
    };

    $scope.previous = function(){
        $scope.step -= 1;
        window.scrollTo(0,0);
    };

    $scope.finish = function($valid){
        if(!$valid)
        {
            $scope.step = $scope.step;
        }
        else
        {
            $http.post('new-submission', { id: $scope.job_id, application: $scope.application })
                .success(function(data, status, headers, config){
                    window.location.href = data.redirect_url;
                });
        }
    };
}

function check() {
    var check = false;
    jQuery.each(jQuery('fieldset.input-group'), function () { //loops through all fieldsets
        if (!check) { //are there no fieldsets with  3 filled input elements then check is false so far
            check = jQuery(this).find('input:text,[type^="number"]').filter(function () { //checks whether inputs are filled
                return this.value != "";
            }).length > 2; //If filled inputs > 2 -> check = true
        }
    });

    return check;
}

angular.module('dxs-vkgroupApp')
    .controller('StepController', StepController);
20
nielsv

まず、jQueryファイルアップロードプラグインのすべての基本ファイルを含めます

_<!-- jQuery File Upload Stylesheets -->
<link rel="stylesheet" href="jquery.fileupload.css" />
<link rel="stylesheet" href="jquery.fileupload-ui.css" />

<!-- The Load Image plugin is included for image preview and resizing functionality -->
<script src="load-image.all.min.js"></script>
<!-- The Canvas to Blob plugin is included for image resizing functionality -->
<script src="canvas-to-blob.min.js"></script>
<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
<script src="jquery.iframe-transport.js"></script>
<!-- The basic File Upload plugin -->
<script src="jquery.fileupload.js"></script>
<!-- The File Upload processing plugin -->
<script src="jquery.fileupload-process.js"></script>
<!-- The File Upload image preview & resize plugin -->
<script src="jquery.fileupload-image.js"></script>
<!-- The File Upload validation plugin -->
<script src="jquery.fileupload-validate.js"></script>
<!-- The File Upload Angular JS module -->
<script src="jquery.fileupload-angular.js"></script>
_

@Discosultanが述べたように、app.jsファイルに_blueimp.fileupload_モジュールを含めます。

_var app = angular.module('dxs-vkgroupApp', ['blueimp.fileupload', 'ngRoute', 'gettext'])
_

formタグのaction属性のいずれかに、画像をアップロードする必要のあるURLを必ず記載してください

_<form action="//jquery-file-upload.appspot.com/" file-upload="options" 
enctype="multipart/form-data" name="steponeForm" novalidate autocomplete="off">
....
  <!-- Add Files Button -->
  <span class="btn btn-success fileinput-button">
    <i class="glyphicon glyphicon-plus"></i>
  <span>Add files...</span>
  <input type="file" name="files" multiple="" ng-disabled="disabled">
  </span>

  <!-- Start Upload Button -->
  <button type="button" class="btn btn-primary start" ng-click="submit()">
    <i class="glyphicon glyphicon-upload"></i>
    <span>Start upload</span>
  </button>
....
</form>
_

または_file-upload_ディレクティブに渡されたoptionsオブジェクト内

_$scope.options = {
    maxFileSize: 5000000,
    type: "POST",
    url:'//jquery-file-upload.appspot.com/',
    acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i
};
_

また、HTMLテンプレートで言及されているsubmit()はプラグイン自体によって実装されており、コントローラーでオーバーライドする必要はありません。

プラグインデモで実装されているように、アップロード前の画像プレビューとファイルアップロードの進行状況を含めるように Plunkr を更新しました

10
Prayag Verma

ここで撮影しています。 submit()が機能しない原因は、_file-upload_ディレクティブを宣言するサードパーティモジュールがアプリで使用できないという事実です。 submit()は、_file-upload_ディレクティブで使用されるコントローラーのスコープの一部である必要があります。

変更してみてくださいapp.js

var app = angular.module('dxs-vkgroupApp', ['ngRoute', 'gettext', 'blueimp.fileupload'])

5
Jaanus Varus