2012-11-27 14 views
16

私は指示のテストを書こうとしていますので、私は$compileで手作業で作っています。 (はい、私はこれにe2eテストを使用できることを知っていますが、この場合、私は単体テストのアプローチを使用しているので、私は単体テストのアプローチを使用しているので、私はいくつかのDOMの独立したロジックをテストします)。エラー:割り当て不可能なモデル式:未定義

私はバインディング〜へscope: {foo: '='}。私はディレクティブのスコープでそれを設定しようとすると、私は次のエラーを取得する:

この fiddleで再現
Error: Non-assignable model expression: undefined (directive: foo) 
    at Error (<anonymous>) 
    at $get.parentSet (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:4146:25) 
    at Object.<anonymous> (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:4160:23) 
    at Object.$get.Scope.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:7693:38) 
    at Object.$get.Scope.$apply (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:7894:24) 
    at SNAKE_CASE_REGEXP (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:930:13) 
    at Object.invoke (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:2788:25) 
    at bootstrap (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:928:12) 
    at angularInit (https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:904:5) 
    at https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.js:14397:5 

。これは、属性名「バー」のためのディレクティブ要素(<div foo></div>)に見て、あなたのディレクティブとオブジェクト内の双方向のデータバインディングを行うために起こっていること

scope: { 
    bar: '=' 
} 

:あなたが持っているあなたのディレクティブで

答えて

25

属性に指定されています。まず、bar属性を追加する必要があります。次に、スコープ内に属性の値の名前を設定する必要があります。 http://jsfiddle.net/u4BTu/6/

+1

一度に1行をコメントアウトするのとは別に、どのスコープ要素について不平を言うことができますか?このエラーのエラーメッセージには記載されていません。全体的なディレクティブ名のみ。 OPの例は明白ですが、多くのバインディングを持つディレクティブが発生した場合はどうなりますか? –

+0

@JoshRibakoff 1つの方法は、Angularコードにブレークポイントをスローし、変数が 'nodeLinkFn'でどのパラメータを探しているかを調べることです。具体的には、' definition'変数に有用な情報が含まれているはずです。 – cincodenada

0

このエラーのもう1つの原因は、Angularの属性のnormalizationを考慮しないことです。このスコープ宣言で

<my-directive parameter-one="foo" parameter_two="bar"></my-directive> 

:あなたは次のディレクティブを持っている場合たとえば、

scope: { 
    'parameter-one': '=', 
    parameter_two: '=', 
} 

あなたはこのエラーを取得します。修正するには、スコープ宣言に正規化されたバージョンを使用してください:

scope: { 
    parameterOne: '=', 
    parameterTwo: '=', 
} 
関連する問題