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);
まず、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 を更新しました
ここで撮影しています。 submit()
が機能しない原因は、_file-upload
_ディレクティブを宣言するサードパーティモジュールがアプリで使用できないという事実です。 submit()
は、_file-upload
_ディレクティブで使用されるコントローラーのスコープの一部である必要があります。
変更してみてくださいapp.js:
var app = angular.module('dxs-vkgroupApp', ['ngRoute', 'gettext', 'blueimp.fileupload'])