2013-06-28 40 views
6

我有一個奇怪的問題,無法在{{}}或ng-repeat和其他表達式中使用下劃線函數。我的確切測試功能是

{{_.last([1,2,3,4])}} 

...在頁面的HTML中。

我能看到正確答案(4)只有當我在我的控制器做到這一點:

$scope._ = _; 

我試圖注入_爲出廠到我的主要應用模塊,然後注入到這一點我控制器,但它似乎並沒有將其注入$範圍。

任何人都可以看到我犯的錯誤嗎?或者有沒有一種機制可以防止下劃線庫進入$ scope?我正在使用angular v.1.0.7和最近版本的下劃線(不確定確切的版本號,但它在最近3周內)。

+0

爲了澄清,我可以在控制器內部使用下劃線。它只在視圖(HTML標記內)中不可見。 – electrichead

+0

對於任何人在2015年閱讀:請不要這樣做!在你的控制器中寫一個函數,並使用下劃線/ Ramda/lodash等。將這些庫注入視圖繞過表達式中的保護措施,通常是一個糟糕的主意! – electrichead

回答

5

角度表達式({{expression}})針對本地$範圍進行評估,如果您已定義控制器,則該範圍是$ scope對象,如函數MyCtrl($scope){}

因此,當您在表達式中使用_時,將根據$ scope對_進行評估,由於$ scope.does沒有_成員,因此表達式失敗。

因此,在您的視圖中使用_的唯一方法是使其在$ scope對象上可用:$scope._ = _;


順便說一下,在瀏覽器環境中使用時,強調增加_爲全局對象,因此它在你的JS是可用的。這意味着沒有必要「將_作爲工廠注入」。

+0

我正在嘗試注入,因爲這個線程(http://stackoverflow.com/questions/14968297/use-underscore-inside-controllers),但事實證明,是讓它在控制器中可用。諷刺的是,我的問題的答案在OP的問題中,而不是在我通過谷歌搜索找到的答案中。當應用程序加載時,我現在將下劃線注入到$ rootScope中。謝謝澄清! – electrichead