Use sublinhado dentro dos controladores angulares


126

Como uso a biblioteca de sublinhado nos controladores angularjs?

Nesta postagem: AngularJS limitTo nos últimos 2 registros, alguém sugeriu atribuir uma variável _ ao rootScope para que a biblioteca fique disponível para todos os escopos no aplicativo.

Mas não estou claro onde fazê-lo. Quero dizer, deve ir na declaração do módulo de aplicativo? ou seja:

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

Mas então, onde eu carrego a sublinhada lib? Eu só tenho na minha página de índice a diretiva ng-app e a referência de script para as bibliotecas angular-js e underscore?

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>
...  

Como faço para conseguir isso?


bem, o que você tentou e não funcionou?
— mpm

Bem, eu não sei por onde começar. Como vincular qualquer rei de arquivos <script> à parte angularjs? (controladores, serviços, diretivas ... etc). Existe alguma exigência ('...') como expressão?
— 1919 Pablo Pablo

basta declarar a tag de script apropriada com sublinhado no seu arquivo html, como você fez com angular ou jquery.
— mpm

Ele estará disponível automaticamente sob o caractere _ ?? Quão??
— 1919 Pablo Pablo

Respostas:


231

Quando você inclui o Sublinhado, ele se anexa ao windowobjeto e, portanto, está disponível globalmente.

Então você pode usá-lo no código Angular como está.

Você também pode envolvê-lo em um serviço ou fábrica, se desejar que ele seja injetado:

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

E então você pode solicitar o _módulo do seu aplicativo:

// 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
Não entendo por que você injetaria quando já está no escopo da janela global.
— Walter Stabosz

36
Provavelmente pelas mesmas razões pelas quais você injeta qualquer coisa, em vez de colocar tudo no escopo global. No entanto, como é muito menos provável que você queira substituir sua biblioteca de sublinhado durante o teste do que alguma outra dependência mais específica, é compreensível que isso não pareça necessário.
— confessar.

50
é necessário quando você adiciona 'use strict' ao seu arquivo. Desde sublinhado / lodash não for definido ele irá lançar ReferenceError: _ não está definido ... você tem que injetá-lo, ou o uso window._
— Shanimal

23
Ha! Eu queria fazer a injeção porque é legal, obrigado por me dar uma verdadeira razão, @ Shanimal.
— Aditya MP

10
você também pode injetar _ para fins de teste. Como você introduziria a dependência de sublinhado em um ambiente de suíte de testes
— sunwukung

32

Eu tenho implementado @ sugestão de satchmorun aqui: https://github.com/andresesfm/angular-underscore-module

Para usá-lo:

  1. Verifique se você incluiu underscore.js no seu projeto

    <script src="bower_components/underscore/underscore.js">
  2. Pegue:

    bower install angular-underscore-module
  3. Adicione angular-underscore-module.js ao seu arquivo principal (index.html)

    <script src="bower_components/angular-underscore-module/angular-underscore-module.js"></script>
  4. Adicione o módulo como uma dependência na sua definição de aplicativo

    var myapp = angular.module('MyApp', ['underscore'])
  5. Para usar, adicione como dependência injetada ao seu Controlador / Serviço e ele estará pronto para uso

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

Não parece funcionar. Eu recebo um erro indefinido:Uncaught ReferenceError: _ is not defined
— chovy

Eu adicionei o esclarecimento: você precisa incluir underscore.js. Este conector apenas ajuda você a usá-lo em um serviço. Veja a resposta de @satchmorun
— unifique

31

Eu uso isso:

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 sobre a meio caminho para obter mais informações sobre run.


isso parece bom, mas você tem um exemplo? Eu preciso mudar todas as letras maiúsculas para superior no primeiro caractere usando apenas _.capitalize ()
— Nate

2
Eu acho que isso deve funcionar <p>{{ _.capitalize('lalala') }}</p>?
— fios

1
@LVarayut Eu não sei, por que não tentar? (Desde então, mudei para ReactJS)
— fios

Por favor, use o serviço. Evite adicionar coisas ao seu $ rootScope para ajudá-lo a ter um melhor desempenho.
— Tim Hong

Não tenho certeza do que fiz de errado, mas não consegui que a parte "use in views" funcionasse. Mas passar o serviço para o controlador e depois para o tpl através de $ ctrl funciona.
— Olivvv


1

Se você não se importa em usar o lodash, experimente https://github.com/rockabox/ng-lodash, que envolve o lodash completamente, portanto é a única dependência e você não precisa carregar outros arquivos de script, como o lodash.

O Lodash está completamente fora do escopo da janela e não "espera" que ele tenha sido carregado antes do seu módulo.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.