1

私が使用している正確なディレクティブは次のとおりです。

'use strict';
angular.module('App')
  .directive('aView', function ($stateParams) {

    this.link = function(scope, template, directiveAttrs){
      template.addClass(scope.elem.classes);
    }

    return {
      template: '<div ng-transclude></div>',
      restrict: 'E',
      replace: true,
      scope: {elem: '='},
      compile: function(template){
        return function(scope, template, directiveAttrs){
          template.addClass(scope.elem.classes);
        }
      }
    }
  });

これにより、次のエラーが表示されます。

TypeError: Cannot set property 'link' of undefined
    at http://localhost:9000/scripts/directives/aView.js:5:15
    at Object.invoke (http://localhost:9000/bower_components/angular/angular.js:2990:25)
    at http://localhost:9000/bower_components/angular/angular.js:3894:43
    at Array.forEach (native)
    at forEach (http://localhost:9000/bower_components/angular/angular.js:130:11)
    at Object.<anonymous> (http://localhost:9000/bower_components/angular/angular.js:3892:13)
    at Object.invoke (http://localhost:9000/bower_components/angular/angular.js:3000:28)
    at http://localhost:9000/bower_components/angular/angular.js:2838:37
    at Object.getService [as get] (http://localhost:9000/bower_components/angular/angular.js:2960:39)
    at addDirective (http://localhost:9000/bower_components/angular/angular.js:4609:51) 

これの奇妙な点は、このディレクティブの返された構成オブジェクト内のどこにも this.link() 関数を参照していないことです。また、なぜ未定義になるのですか? 私の指示は、アグヘッドのレッスン 25 のほぼ正確なコピーです。

ここで、this.link() 関数をコメントアウトすると、一連のエラーが表示されます。

10 x :
TypeError: undefined is not a function
    at new ngDirective.controller (http://localhost:9000/bower_components/angular/angular.js:14357:5)
    at invoke (http://localhost:9000/bower_components/angular/angular.js:3000:28)
    at Object.instantiate (http://localhost:9000/bower_components/angular/angular.js:3012:23)
    at http://localhost:9000/bower_components/angular/angular.js:4981:24
    at http://localhost:9000/bower_components/angular/angular.js:4560:17
    at forEach (http://localhost:9000/bower_components/angular/angular.js:137:20)
    at nodeLinkFn (http://localhost:9000/bower_components/angular/angular.js:4545:11)
    at compositeLinkFn (http://localhost:9000/bower_components/angular/angular.js:4191:15)
    at compositeLinkFn (http://localhost:9000/bower_components/angular/angular.js:4194:13)
    at publicLinkFn (http://localhost:9000/bower_components/angular/angular.js:4096:30) angular.js:5930
Error: 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [a lot of code here]...
...debug.watchPerf[watchStr].calls += 1;\n                return ret;\n              }; newVal: undefined; oldVal: undefined"]]
    at Error (<anonymous>)
    at Object.Scope.$digest (http://localhost:9000/bower_components/angular/angular.js:8126:19)
    at Object.$delegate.__proto__.$digest (<anonymous>:844:31)
    at Object.Scope.$apply (http://localhost:9000/bower_components/angular/angular.js:8304:24)
    at Object.$delegate.__proto__.$apply (<anonymous>:855:30)
    at http://localhost:9000/bower_components/angular/angular.js:9669:36
    at completeOutstandingRequest (http://localhost:9000/bower_components/angular/angular.js:3139:10)
    at http://localhost:9000/bower_components/angular/angular.js:3433:7 

何が起こっている?私の this.link 関数への不思議な依存関係が角度内に現れましたか?
ところで、この関数の名前は関係ありませんが、参照として別の名前でエラーが表示されます。
ところで、私のスタックは次のとおりです。プロジェクトはyo angular generatorで作られています。
BTW3、このディレクティブをいじり始める前に、もともと yo angular:directive で生成されたものにはリンクがありました: function postLink(scope, element, attrs)これが重要な場合。
時間をありがとう、
ジャレッド

4

1 に答える 1

1

通常、ディレクティブでthiswindowですが、strict モードを使用しているため、 に変更されundefinedます。newこれは、キーワードを使用せずにコンストラクター パターンを使用しているときに、誤ってグローバル オブジェクトを変更するのを防ぐためです。

を削除して"use strict";もエラーは表示されませんが、console.log(this)window が表示された場合は、とにかくそのようなメソッドを追加するべきではありません。私はあなたがただすることをお勧めします

var link = function() { ... };
于 2013-09-11T16:09:39.320 に答える