【问题标题】:TypeError: Cannot read property 'bind' of undefined using ng-cropper directiveTypeError:无法使用 ng-cropper 指令读取未定义的属性“绑定”
【发布时间】: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

我想,

  1. 'cropper' 应该在什么基础上解决? (所以我知道要检查什么)
  2. 你能看出我的代码有什么明显的问题吗?

【问题讨论】:

  • 你是否在 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


【解决方案1】:

您需要在加载依赖项时保持精确的顺序,并且应先加载 jQuery,然后再加载 AngularJS 和其他内容,如示例 HTML here 中所示。

<script src="../bower_components/jquery/dist/jquery.min.js"></script>
<script src="../bower_components/angular/angular.min.js"></script>
<script src="../bower_components/cropper/dist/cropper.js"></script>
<link href="../bower_components/cropper/dist/cropper.css" rel="stylesheet">
<script src="../ngCropper.js"></script>

【讨论】:

  • 除了改变jquery顺序的任何解决方案?使用 angular 然后 jquery 之类的顺序的现有项目。另外,如果我更改了顺序,似乎会出现另一个类型错误,例如“无法读取属性 'on'”。
猜你喜欢
  • 2022-06-16
  • 2021-11-07
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2021-12-15
  • 2018-03-07
  • 2020-07-25
  • 1970-01-01
相关资源
最近更新 更多