2013-12-12 214 views
4

我在這裏有一個非常簡單的例子:http://jsfiddle.net/daylight/hqHSr/AngularJS是否錯誤地解析了值?

要嘗試它,只需去小提琴,然後單擊[添加項]按鈕來添加一些行。

接下來,點擊旁邊的複選框任何項目,你會看到類似下面的東西: AngularBugStep1

問題:只顯示數字部分 的問題是,該值應顯示整個顯示在該行中的字符串。在這個例子中,它意味着它應該顯示:86884-LLMUL。 請注意,它只顯示值的數字部分。

如果你看看控件,你會看到我正在使用type =「text」的輸入。另外,如果您查看模型(simpleItem)對象,您會看到它擁有的一個屬性是一個字符串。 的JavaScript模型類的樣子:

function simpleItem(id) { 
     this.id = id; 
    } 

我試圖強迫爲String類型 當我生成每個simpleItems的我甚至跑那麼遠,將它們設置爲一個字符,當我打電話構造函數(只是強制id設置爲字符串類型)。

下面是初始化每個simpleItem ID的代碼:

currentItem.id = getRandom(100000).toString() + "-" + getRandomLetters(5).toUpperCase(); 

你可以看到在小提琴的代碼的其餘部分,但事情是我生成一個隨機值,並與一起串聯值連字符和5個字母。這只是這個示例的一個愚蠢的小代碼。

但現在,這裏是真正奇怪的部分。 如果我只是將連字符更改爲另一個字符(如大寫X),則每次單擊該複選框時都會出現錯誤。 這裏是改變的代碼和新的輸出,你可以在修改後的小提琴看到:fiddle version 2

currentItem.id = getRandom(100000).toString() + "X" + getRandomLetters(5).toUpperCase(); 

enter image description here

而且,現在如果你在瀏覽器中打開開發工具,你會在控制檯中看到每次單擊[添加項目]按鈕時,Angular現在都會報告錯誤。它看起來像: enter image description here

添加單引號?修復?它 如果你去到HTML和改變從這個以下行:

ng-init="itemId ={{l.id.toString()}}" 

這個

ng-init="itemId ='{{l.id.toString()}}'" 

現在,當你運行它,錯誤就會消失,這將作爲你可以看到在這裏更新的小提琴:fiddle Version 3

Angular:將連字符轉換爲減號? 您會看到,Angular似乎將其​​轉換爲數字,試圖對其進行數學運算(將連字符解析爲負號),然後截斷字符串部分。這一切似乎工作時,我用連字符,但是當我使用X然後角扼流圈。

下面是添加單引號時的樣子 - 當然,Dev Tools控制檯中的角度誤差也會消失。 enter image description here

角度力到數字類型? 爲什麼會出現在Angular中?就好像它試圖強制我的字符串值爲一個數字,即使INPUT元素是鍵入文本而JavaScript var是字符串類型。 任何人對此有想法?

星號(乘號)是什麼?

正當我完成這個時,我想知道如果我將 - 改爲*並再次運行,會發生什麼。這一次我看到下面的錯誤,這表明某些東西正在嘗試轉換爲數字。

enter image description here

回答

2

更換您的NG-INIT與

ng-init="itemId =l.id.toString()" 

在與文檔之後,你應該只使用初始化在特殊情況下,無論如何,你應該依靠你的控制器上爲了這。 http://docs.angularjs.org/api/ng.directive:ngInit

+1

這是我想知道的確切答案。我現在正在學習Angular,所以花了我相當長的時間來確定我如何初始化一個變量,並且沿途我以某種方式得到了不正確的語法,但它仍然「工作」。如果你可以這樣稱呼它。感謝您注意到究竟發生了什麼。 – raddevus

3

這是預期的行爲。 Angular只是將您在示波器中的文本插入到ng-init表達式using scope.$eval中,然後執行該表達式。這與周圍環境的其餘部分的input框的類型幾乎沒有關係。

Angular應該包裝它在quotes中做的任何插值絕對不是理想的,它會在所有其他地方打破它的使用,如class="my-class {{dynamic-class}}"

1

ng-init需要一個角度表達式。你不必在那裏使用大括號。你可以簡單地把它寫這樣的:

ng-init="itemId=l.id" ng-click="checkBoxClicked(itemId)" 
2

我想我們只是對Angular的怪異感到困惑。基本上,你給一個字符串變成一個javascript表達式,因爲它在{{}}中。它已經,明確,一個字符串(雙引號之間):

NG-的init = 「的itemId = {{l.id.toString()}}」

它顯然忽略了事實上,你說的「嘿,沒有,這是一個真正的字符串」與你的l.id.toString()。它不關心。它已經是一個字符串,並且要評估它。

只使用單引號?

如果你ng-init itemId={{undefined===undefined}},你會發現什麼? (它在警報中打印「真」)。

同樣的:(undefined === undefined用引號括起來)ng-init itemId={{'undefined===undefined'}};在警報中打印真實。

+1

因爲我現在在學習Angular,所以我試圖初始化我的變量,並且無法使它正常工作,並且陷入了思考,我不得不添加{{}}指令來執行此操作。那是我的錯誤,然後當我走下這條路時,我對所發生的事情變得更加困惑。 lex82和查理布朗真的達到了答案,解釋說我不需要在ng-init中使用指令。這是一個有趣的副作用,你不覺得嗎? – raddevus

+1

當然。我在一艘類似的船上 - 也許只有大約3周的角度沉浸在前方。 – jsplaine