Utilice guiones bajos dentro de los controladores angulares


126

¿Cómo uso la biblioteca de subrayado dentro de los controladores angularjs?

En esta publicación: AngularJS limitTo por los últimos 2 registros alguien sugirió asignar una variable _ al rootScope para que la biblioteca esté disponible para todos los ámbitos dentro de la aplicación.

Pero no tengo claro dónde hacerlo. Quiero decir, ¿debería ir en la declaración del módulo de la aplicación? es decir:

var myapp = angular.module('offersApp', [])
            .config(['$rootScope', function($rootScope) { }

Pero entonces, ¿dónde cargo lib de subrayado? ¿Acabo de tener en mi página de índice la directiva ng-app y la referencia del script para las bibliotecas angular-js y subrayado?

index.html:

<head>
</head>
<body ng-app="offersApp">
...
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="scripts/vendor/angular.js"></script>
<script src="scripts/vendor/underscore.js"></script>
...  

¿Cómo logro esto?


bueno, ¿qué intentaste y no funcionó?
mpm

Bueno, no sé por dónde empezar. ¿Cómo vinculo cualquier rey de archivos <script> con la parte angularjs? (controladores, servicios, directivas ... etc.). ¿Hay algún requerimiento ('...') como expresión?
Pablo

simplemente declare la etiqueta de script adecuada con guión bajo en su archivo html, como lo hizo con angular o jquery.
mpm

¿Estará disponible automáticamente bajo el carácter _? ¿¿Cómo??
Pablo

Respuestas:


231

Cuando incluye Underscore, se adjunta al windowobjeto y, por lo tanto, está disponible globalmente.

Para que pueda usarlo desde el código angular tal como está.

También puede envolverlo en un servicio o una fábrica, si desea que se inyecte:

var underscore = angular.module('underscore', []);
underscore.factory('_', ['$window', function($window) {
  return $window._; // assumes underscore has already been loaded on the page
}]);

Y luego puede solicitar el _en el módulo de su aplicación:

// Declare it as a dependency of your module
var app = angular.module('app', ['underscore']);

// And then inject it where you need it
app.controller('Ctrl', function($scope, _) {
  // do stuff
});

27
No entiendo por qué lo inyectarías cuando ya está en el ámbito de la ventana global.
Walter Stabosz

36
Probablemente por las mismas razones que inyectas algo, en lugar de poner todo en el ámbito global. Sin embargo, dado que es mucho menos probable que desee sustituir su biblioteca de guiones bajos durante las pruebas que otras dependencias más específicas, es comprensible que no parezca necesario.
Fess.

50
es necesario cuando agrega 'use estricto' a su archivo. Dado que el subrayado / lodash no está definido, arrojará ReferenceError: _ no está definido ... debe inyectarlo o usar window._
Shanimal

23
¡Decir ah! Quería hacer la inyección porque es genial, gracias por darme una razón real, @Shanimal.
Aditya MP

10
También es posible que desee inyectar _ en aras de la prueba. ¿Cómo haría para llevar la dependencia de subrayado a un entorno de conjunto de pruebas
Sunwukung

32

He implementado la sugerencia de @ satchmorun aquí: https://github.com/andresesfm/angular-underscore-module

Para usarlo:

  1. Asegúrese de haber incluido underscore.js en su proyecto

    <script src="bower_components/underscore/underscore.js">
  2. Consíguelo:

    bower install angular-underscore-module
  3. Agregue angular-underscore-module.js a su archivo principal (index.html)

    <script src="bower_components/angular-underscore-module/angular-underscore-module.js"></script>
  4. Agregue el módulo como una dependencia en la definición de su aplicación

    var myapp = angular.module('MyApp', ['underscore'])
  5. Para usar, agregue como una dependencia inyectada a su Controlador / Servicio y está listo para usar

    angular.module('MyApp').controller('MyCtrl', function ($scope, _) {
    ...
    //Use underscore
    _.each(...);
    ...

No parece funcionar. Me sale un error indefinido:Uncaught ReferenceError: _ is not defined
chovy

Agregué la aclaración: debe incluir underscore.js. Este conector solo le ayuda a usarlo en un servicio. Ver la respuesta de @ satchmorun
unificar el

31

Yo uso esto:

var myapp = angular.module('myApp', [])
  // allow DI for use in controllers, unit tests
  .constant('_', window._)
  // use in views, ng-repeat="x in _.range(3)"
  .run(function ($rootScope) {
     $rootScope._ = window._;
  });

Consulte https://github.com/angular/angular.js/wiki/Understanding-Dependency-Injection a mitad de camino para obtener más información run.


esto se ve bien, pero ¿tienes un ejemplo? Necesito cambiar todo en mayúsculas a mayúsculas en el primer carácter solo usando _.capitalize ()
Nate

2
Creo que esto debería funcionar <p>{{ _.capitalize('lalala') }}</p>?
cables

1
@LVarayut No lo sé, ¿por qué no probarlo? (Desde entonces me mudé a ReactJS)
cables

Utilice el servicio en su lugar. Evite agregar cosas a su $ rootScope lo ayudará a tener un mejor rendimiento.
Tim Hong

No estoy seguro de lo que hice mal, pero no pude conseguir que funcionara la parte de "uso en vistas". Pero pasar el servicio al controlador y luego al tpl a través de $ ctrl funciona.
Olivvv


1

Si no te importa usar lodash, prueba https://github.com/rockabox/ng-lodash, lo envuelve completamente, por lo que es la única dependencia y no necesita cargar ningún otro archivo de script como lodash.

Lodash está completamente fuera del alcance de la ventana y no "espera" que se haya cargado antes de su módulo.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.