2013-05-19 22 views
28

Tôi có một khối trong mẫu JS góc của tôi a laLàm thế nào tôi có thể gọi encodeURIComponent từ mẫu angularJS?

<a href="#/foos/{{foo.id}}">{{foo.name}}</a> 

Tuy nhiên, tài sản foo.id đôi khi có thể chứa các ký tự funky ('/'). Tôi muốn làm một cái gì đó như thế này:

<a href="#/foos/{{encodeURIComponent(foo.id)}}">{{foo.name}}</a> 

nhưng nó không hoạt động? Làm thế nào tôi có thể sửa lỗi này?

+0

Tôi thấy câu trả lời này - http: // stackoverflow. com/a/14512986/775359 - và tôi đã tự hỏi - tại sao tôi không thể sử dụng '' 'encodeURIComponent''' trực tiếp trong mẫu ... Rõ ràng một bộ lọc là bắt buộc. –

Trả lời

63

Bạn có thể tạo bộ lọc gọi encodeURIComponent

Ví dụ:

var app = angular.module('app', []); 
app.filter('encodeURIComponent', function() { 
    return window.encodeURIComponent; 
}); 

Sau đó làm

<a href="#/foos/{{foo.id | encodeURIComponent}}">{{foo.name}}</a> 

Chạy ví dụ: http://jsfiddle.net/YApdK/

+3

Điều này cảm thấy sai khi sử dụng một chức năng nhưng nó hoạt động ngay lập tức. –

+0

Cảm ơn, ví dụ rất ấn tượng cung cấp javascript đến html với cú pháp rất ngắn – bla

+3

Khi @RickJolly chỉ ra, bạn nên sử dụng 'ng-href'instead của' href' để chắc chắn rằng các liên kết được hiển thị bằng góc trước khi chúng có thể được nhấp.Bạn cũng có thể tiêm '$ window' vào bộ lọc thay vì sử dụng' window' trực tiếp. –

12

làm lại @jimr 'mã s, có tính đến @aj-richardson' s khuyến nghị.

Bạn có thể sử dụng bộ lọc trong biểu thức để định dạng dữ liệu trước khi hiển thị.

Tạo một bộ lọc:

var app = angular.module('app', []); 
app.filter('encodeURIComponent', function($window) { 
    return $window.encodeURIComponent; 
}); 

Sau đó áp dụng bộ lọc:

<a ng-href="#/foos/{{foo.id | encodeURIComponent}}">{{foo.name}}</a> 
  • ng-href được sử dụng thay vì href để chắc chắn rằng các liên kết được đưa ra bởi AngularJS trước khi chúng có thể được nhấp vào.
  • $window được đưa vào bộ lọc thay vì sử dụng trực tiếp window.

    Bạn nên tham khảo toàn cầu window thông qua dịch vụ $window, để có thể bị ghi đè, xóa hoặc giả mạo để thử nghiệm.


Tài liệu tham khảo:

  1. AngularJS API: $window
  2. AngularJS Developer Guide: filters
  3. AngularJS Developer Guide: expressions
Các vấn đề liên quan