2012-11-27 19 views
16

我正在嘗試爲指令編寫測試,所以我正在用$compile手動構建它。 (是的,我知道我可以使用e2e測試,但在這種情況下,我想測試一些DOM獨立邏輯,因此我使用單元測試方法。)錯誤:不可分配的模型表達式:undefined

我有一個我綁定的字段與scope: {foo: '='}。當我試圖把它放在指令的範圍,我得到以下錯誤:

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 

轉載於本fiddle

回答

25

在你的指令,你必須:

scope: { 
    bar: '=' 
} 

這意味着它要尋找一個屬性名稱「欄」的指令元素(<div foo></div>)和您的指令和對象中做雙向綁定爲屬性指定。所以,首先你需要添加一個bar屬性,然後你需要在你的範圍內設置屬性值的名稱。請參閱http://jsfiddle.net/u4BTu/6/

+1

除了一次註釋掉1行並刷新以外,如何判斷其抱怨的範圍元素?它沒有在錯誤消息中說明這個錯誤。只有總體的指令名稱。 OP的例子很明顯,但是如果它發生在一個有很多綁定的指令中? –

+0

@JoshRibakoff一種方法是在Angular代碼中引入一個斷點並檢查變量以查看它在'nodeLinkFn'中尋找哪個參數 - 具體來說,'definition'變量應該包含有用的信息。 – cincodenada

0

此錯誤的另一個可能原因是忽略了對Angular的屬性normalization的解釋。舉例來說,如果你有以下指令:

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

有了這個範圍聲明:

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

你會得到這個錯誤。若要更正,請使用範圍聲明的標準化版本:

scope: { 
    parameterOne: '=', 
    parameterTwo: '=', 
} 
相關問題