2013-06-28 38 views
6

Tôi gặp vấn đề lạ khi không thể sử dụng các hàm gạch dưới bên trong {{}} hoặc bên trong ng-repeat và các biểu thức khác. Hàm kiểm tra chính xác của tôi là

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

... ngay trong HTML của trang.

tôi có thể nhìn thấy câu trả lời đúng (4) chỉ khi tôi làm điều này trong bộ điều khiển của tôi:

$scope._ = _; 

Tôi cố gắng để tiêm _ như một nhà máy vào mô-đun ứng dụng chính của tôi và sau đó tiêm đó vào tôi điều khiển, nhưng nó doen't dường như tiêm nó vào phạm vi $.

Có ai có thể thấy sai lầm tôi đang thực hiện không? Hoặc là có một cơ chế ở đó sẽ ngăn chặn các thư viện gạch dưới nhận được vào phạm vi $? Tôi đang sử dụng v.1.0.7 góc và phiên bản mới nhất của gạch dưới (không chắc chắn về số phiên bản chính xác, nhưng nó nằm trong vòng 3 tuần qua).

+0

Để làm rõ, tôi có thể sử dụng dấu gạch dưới bên trong chính bộ điều khiển. Nó không chỉ hiển thị trong khung nhìn (bên trong đánh dấu HTML). – electrichead

+0

Để bất cứ ai đọc điều này trong năm 2015: Xin đừng làm điều này! Viết một hàm trong bộ điều khiển của bạn và sử dụng dấu gạch dưới/Ramda/lodash, vv thay vào đó. Việc tiêm các thư viện này vào chế độ xem của bạn sẽ bỏ qua các biện pháp bảo vệ trong các biểu thức và thường là một ý tưởng tồi! – electrichead

Trả lời

5

Biểu thức góc ({{expression}}) được đánh giá theo phạm vi $ địa phương, trong trường hợp bạn đã xác định bộ điều khiển, là đối tượng $ scope như trong hàm MyCtrl($scope){}.

Vì vậy, khi bạn sử dụng _ trong biểu thức của mình, _ được đánh giá dựa trên phạm vi $ và vì $ scope.doesn't có thành viên _, biểu thức của bạn không thành công.

Vì vậy, chỉ sử dụng _ trong quan điểm của bạn là làm cho nó khả dụng trên đối tượng $ scope với: $scope._ = _;.


Btw, khi được sử dụng trong ngữ cảnh trình duyệt, gạch dưới thêm _ làm đối tượng chung, vì vậy nó có sẵn trong JS của bạn. Điều này có nghĩa là không cần phải "tiêm _ làm nhà máy".

+0

Tôi đã cố gắng tiêm vì thread này (http://stackoverflow.com/questions/14968297/use-underscore-inside-controllers), nhưng nó chỉ ra rằng là để làm cho nó có sẵn trong bộ điều khiển. Trớ trêu thay, câu trả lời cho câu hỏi của tôi là trong câu hỏi của OP, không phải trong câu trả lời tôi tìm thấy thông qua tìm kiếm google. Bây giờ tôi đang tiêm dấu gạch dưới vào $ rootScope khi ứng dụng tải. Cảm ơn bạn đã làm rõ! – electrichead

Các vấn đề liên quan