【发布时间】:2016-01-13 07:15:04
【问题描述】:
当我尝试加载 ng-cropper 指令时,我收到了TypeError: Cannot read property 'bind' of undefined.,该指令是cropper javascript 图像裁剪库的角度绑定。我不完全确定哪些代码可能与显示最相关,但这是指令的上半部分:
angular.module('ngCropper', ['ng'])
.directive('ngCropper', ['$q', '$parse', function($q, $parse) {
return {
restrict: 'A',
scope: {
options: '=ngCropperOptions',
proxy: '=ngCropperProxy', // Optional.
showEvent: '=ngCropperShow',
hideEvent: '=ngCropperHide'
},
link: function(scope, element, atts) {
var shown = false;
scope.$on(scope.showEvent, function() {
if (shown) return;
shown = true;
preprocess(scope.options, element[0])
.then(function(options) {
debugger;
setProxy(element);
element.cropper(options);
})
});
function setProxy(element) {
if (!scope.proxy) return;
var setter = $parse(scope.proxy).assign;
setter(scope.$parent, element.cropper.bind(element));
}
在setProxy() 函数的setter(scope.$parent, element.cropper.bind(element)); 行上抛出错误。
这是因为 cropper 显然在元素变量上未定义。什么会导致这个?我不是角度指令方面的专家,但我想如果标签是这样设置的,它应该可以很好地解决?
奇怪的是,它在演示应用程序中解决得很好,而且我的代码反映了相同的设置!我唯一的猜测是我可能正在使用的另一个模块可能会干扰?我不愿意把它们全部拿出来,但它可能会归结为这一点。
我的模块声明为:
angular.module('app', [
'ui.router',
'ngMessages',
'ngSanitize',
'LocalStorageModule',
'angular.filter',
'flow',
'ng-sortable',
'focus-if',
'ngCropper',
'controllers', 'services', 'directives', 'filters'])
我参考了这个演示来了解我所做的 - https://github.com/koorgoo/ngCropper/tree/master/demo
我想,
- 'cropper' 应该在什么基础上解决? (所以我知道要检查什么)
- 你能看出我的代码有什么明显的问题吗?
【问题讨论】:
-
你是否在 Angular 之前的 html 中包含了 jQuery?
-
Could not get error 在您的演示中
-
是的,我知道,重新创建的示例确实有效。我很欣赏制作 plunker 的努力,我的代码中一定还有一些东西会导致问题。一般来说,角度会导致元素变量上的
undefined?应该在哪里定义cropper以便在该函数中拾取它? -
@Arkantos 天哪,Arkantos,天才!这正是问题所在。非常感谢,我想我已经让 jquery 在 angular 之后运行了一段时间,因为我没想到要检查它,并且直到现在才证明是一个问题。将此作为答案提交,我会接受:)
-
Angular 在某种程度上可以在没有
jQuery的情况下使用一些有限的 API 工作,但是您使用的CropperJS是一个 jQuery 插件,ngCropper只是CropperJS的包装器,所以对于插件要正常工作,我们应该先加载jQuery。
标签: javascript jquery angularjs angularjs-directive