我正在尝试在我的 Angular 演示项目中实现Crop Plugin Library。我已将所需的模块注入(inject)到我的主模块中,并成功裁剪了一张照片。但是我不知道如何将base64字符串传递给 Controller 。到目前为止,我尝试过的是:
var myApp = angular.module('myModule', ['ngRoute', 'angular-img-cropper', 'app']);
myApp.config(function($routeProvider) {
$routeProvider
.when('/multiple',{
templateUrl: 'templates/multi.html',
controller: 'multiController',
controllerAs: 'multiCtrl'
})
});
myApp.controller('multiController', function ($scope,$rootScope) {
var vm = this;
vm.clickButton = function () {
console.log("photo: "+vm.member_photo);
};
});
HTML-templates / multi.html:
<h1>Multi page which has another controller inside</h1>
<div ng-controller="multiController">
<div ng-controller="ImageCropperCtrl as ctrl">
<input type="file" img-cropper-fileread image="cropper.sourceImage" />
<div>
<canvas width="500" height="300" id="canvas" image-cropper image="cropper.sourceImage" cropped-image="cropper.croppedImage" crop-width="500" crop-height="200" min-width="100" min-height="50" keep-aspect="true" crop-area-bounds="bounds"></canvas>
</div>
<div>Cropped Image (Left: {{bounds.left}} Right: {{bounds.right}} Top: {{bounds.top}} Bottom: {{bounds.bottom}})</div>
<div ng-show="cropper.croppedImage!=null"><img ng-model="member_photo1" ng-src="{{cropper.croppedImage}}" /></div>
<textarea name="member_photo" ng-model="multiCtrl.member_photo" id="member_photo" class="form-control valid">{{cropper.croppedImage}}</textarea>
</div>
<button ng-controller="insideController" ng-click="multiCtrl.clickButton()">Console.log</button>
</div>
如果我检查了textarea,则该值存在,但未在textarea中显示,并且该值也无法在 Controller 内部访问。我究竟做错了什么?
最佳答案
正如@Taylor Buchanan指出的那样,您的代码存在多个问题。我也建议您阅读Angular文档和示例。
除了@Taylor Buchanan指出的问题外,我可以看到您在模板中使用了3个不同的 Controller 。 multiController
,ImageCropperCtrl
和insideController
。我不明白为什么需要那么多 Controller 。
另外,您在textarea不需要单独的ng-model。
考虑到您的需求,我认为一个 Controller 就足够了。
这是sample code @ plunker,它显示了如何使用图像裁剪器以及如何在 Controller 中获取裁剪的图像数据。
script.js
angular.module('myApp', ['angular-img-cropper']);
angular.module('myApp').controller("multiController",[ '$scope', function($scope)
{
$scope.cropper = {};
$scope.cropper.sourceImage = null;
$scope.cropper.croppedImage = null;
$scope.bounds = {};
$scope.bounds.left = 0;
$scope.bounds.right = 0;
$scope.bounds.top = 0;
$scope.bounds.bottom = 0;
$scope.clickButton = function () {
console.log("photo: "+ $scope.cropper.croppedImage);
};
}]);
index.html
<!DOCTYPE html>
<html>
<head>
<script data-require="jquery@2.2.4" data-semver="2.2.4" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<link rel="stylesheet" href="style.css" />
</head>
<body ng-app="myApp" ng-controller="multiController">
<h1>Image Cropper Demo</h1>
<div>
<input img-cropper-fileread="" image="cropper.sourceImage" type="file" />
<div>
<canvas width="500" height="300" id="canvas" image-cropper="" image="cropper.sourceImage" cropped-image="cropper.croppedImage" crop-width="400" crop-height="200" keep-aspect="true" touch-radius="30" crop-area-bounds="bounds"></canvas>
</div>
<div>Cropped Image (Left: {{bounds.left}} Right: {{bounds.right}} Top: {{bounds.top}} Bottom: {{bounds.bottom}})</div>
<div ng-show="cropper.croppedImage!=null">
<img ng-src="{{cropper.croppedImage}}" />
</div>
<textarea name="member_photo" id="member_photo" class="form-control valid">{{cropper.croppedImage}}</textarea>
<button ng-click="clickButton()">Console.log</button>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js"></script>
<script src="angular-img-cropper.min.js"></script>
<script src="script.js"></script>
</body>
</html>
注意:由于我没有使用路由提供程序,因此必须在主体级别显式指定
ng-controller
。使用路由提供程序时,无需在模板中指定ng-controller
。检查$route给出的示例