API não encontrada?
O AngularJS fornece algum encapsulamento de funções, mas quando você tenta acessar essas funções através do objeto global Angular, você achou que elas são muito diferentes das bibliotecas que encontrou no passado.
$ http
Por exemplo, no jQuery, sabemos que sua API é exposta através de um objeto global: $. Quando você precisar fazer uma chamada AJAX, use $ .ajax (). Essa API é muito consistente com as expectativas de pensar.
AngularJS também expõe um objeto global: Angular, que também encapsula a chamada do AJAX e fornece um objeto $ http. No entanto, quando você tenta acessar o Angular. $ HTTP usando a experiência antiga, descobre que não é o caso!
Depois de verificar cuidadosamente a documentação $ http, não consigo encontrar pistas. Onde posso obter esse $ http?
Injeção de dependência/di
De fato, o AngularJS organiza todos os componentes funcionais na injeção de dependência:
No modo de injeção de dependência, todos os componentes devem passar pelos contêineres para acessar um ao outro, o que leva ao fato de que, no AngularJS, você deve usar um intermediário para obter um objeto de instância de um componente:
var injector = angular.injector (['ng'])); injetor.invoke (função ($ http) {// do sth. com $ http});Este intermediário é um contêiner no modo de injeção de dependência. Em AngularJS, é chamado: injetor.
No exemplo de → _ →, podemos ver que temos o objeto $ http, que é realmente uma função.
Injetor/injetor
O injetor é a chave para a implementação da estrutura do AngularJS e o desenvolvimento de aplicativos, que é uma implementação de contêineres DI/IOC.
O AngularJS divide as funções em diferentes tipos de componentes e os implementa separadamente. Esses componentes têm um nome coletivo - provedor/provedor. A figura a seguir lista vários serviços integrados comumente usados para o AngularJS:
Os componentes do AngularJS não podem ser chamados diretamente um do outro. Um componente deve passar por um injetor para chamar outro componente. Esse benefício é que os componentes são dissociados um do outro, e o gerenciamento de todo o ciclo de vida do objeto é jogado ao injetor.
O injetor implementa duas funções importantes:
Receitas de armazenar centralmente para todos os provedores
A receita é realmente: Nome + Class Construtor. Quando o AngularJS é iniciado, esses provedores são registrados pela primeira vez no injetor usando suas receitas. Por exemplo, o componente de serviço de solicitação HTTP é encapsulado na classe $ httpprovider e está registrado no injetor através do nome '$ http'.
Fornecer exemplos de componentes funcionais sob demanda
Outros componentes, como o controlador de um usuário, se você precisar usar a função HTTP, use o nome '$ http' para solicitar o injetor, você pode obter uma instância de serviço HTTP.
Tente modificar o código de → _ → para ver qual é o serviço $ compilador?
Registro componente de serviço
Do ponto de vista do injetor, um componente é um provedor de funções, por isso é chamado de provedor/provedor. Em AngularJS, o provedor é encapsulado na forma de uma classe JavaScript (construtor).
Os nomes de serviços geralmente são identificados por uma string, como '$ http' para o serviço de chamada HTTP, '$ rootscope' para objeto de escopo root, '$ compilando' para serviço de compilação ...
A classe de provedor requer uma função $ get (fábrica de classe). Ao chamar essa função, o injetor pode obter uma instância do componente de serviço.
As informações combinadas de nome e função de classe são chamadas de receita. O Injetor mantém uma biblioteca de receitas centralizadas para criar diferentes componentes sob demanda. Esta biblioteca de receitas é na verdade um objeto de hash, a chave é o nome do serviço e o valor é a definição de classe.
No exemplo de → _ →, definimos uma classe de serviço simples, e a instância desta classe de serviço é uma string: "Olá, mundo!". Usamos 'ezhello' como seu nome de serviço para se registrar no injetor e exibir esta instância através do injetor.
Obter o objeto injetor
Para usar a funcionalidade dos angulares, você deve primeiro obter o injetor. Existem duas maneiras de obter o injetor.
Crie um novo injetor
Você pode criar um novo injetor usando angular.injector ():
angular.injector (módulos, [strictdi]); Obtenha o injetor já criado
Se a estrutura do AngularJS tiver sido iniciada, você poderá usar o método injetor () do objeto DOM para obter o injetor já criado:
var elemento = angular.Element (dom_element);
var injector = element.injector ();
Chamando API via injetor
O injetor possui dois métodos para chamadas de API: Invoke () e Get ().
invocar()
Usando o método Invoke () do injetor, você pode chamar diretamente um corpo de função definido pelo usuário e injetar o objeto de serviço dependente por meio de parâmetros de função. Este é o uso da recomendação e convenção do AngularJS:
angular.injector (['ng']). Invoke (função ($ http) {// do sth. com $ http}); pegar()Você também pode usar o método get () do injetor para obter a instância de serviço com o nome especificado:
var my $ http = angular.injector (['ng']). get ('$ http'); // do sth. com meu $ http→ _ → Exemplo desta vez, usei o método get () para obter diretamente uma instância de serviço e sentir!
Método e princípio de injeção
Existem duas maneiras de informar o injetor do objeto de serviço que precisa ser injetado: injeção de nomes de parâmetro e injeção de matriz de dependência.
Injeção de nome do parâmetro
Quando o AngularJS executa a função Invoke (), converte a definição da função a ser injetada em uma string, verifica sua tabela de parâmetros por meio de expressões regulares e, assim, descobre e injeta o objeto de serviço de que depende:
// myfunc declara essa função para depender do serviço '$ http' var myfunc = function ($ http) {// do sth. com $ http}; injector.invoke (myfunc); // a definição de myfunc será convertida em uma string para verificação de nome do parâmetro.Há um problema com isso, ou seja, quando comprimimos o código JavaScript, o $ HTTP pode ser alterado para outro nome, o que fará com que a injeção falhe.
Depender da injeção de matriz
O AngularJS usa o método da matriz de dependência para resolver o problema causado pela ofuscação de compactação de código. Neste momento, o Invoke () é passado para uma matriz. O último item da matriz é a função a ser executada e os outros itens indicam o nome do serviço que precisa ser injetado na função. O injetor injetará objetos dependentes na função na ordem na matriz.
Com este método, o nome da tabela de parâmetros a ser injetado é irrelevante:
// myfunc depende dos serviços '$ http' e '$ compilem' var myfunc = ['$ http', '$ compile', function (p1, p2) {// do sth. com p1 ($ http), p2 ($ compile)}]; injetor.invoke (myfunc);A instância de → _ → é injetada com um método dependente da matriz. Desta vez, a instância do serviço Ezhello é injetada. Você pode alterar o nome do parâmetro para ver se isso afeta o resultado?
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.