Angular expressions ( {{expression}} ) are evaluated against the local scope $ scope, which, if you define a controller, is a $ scope object as a function MyCtrl($scope){} .
So, when you use _ in your expressions, _ is evaluated by the variable $ scope, and since $ scope.doesn't have a member _ , you lose the expression.
So, the only way to use _ in your views is to make it available to the $ scope object with: $scope._ = _; .
Btw, when used in a browser context, underscore adds _ as a global object, so it is available throughout your JS. This means that there is no need to "enter _ as a factory".
source share