Solucionado (ver solução)
Solucionado
(ver solução)
14
respostas

Angular2: Incluir arquivo JavaScript no Componente

Opa Flávio tudo bom.

Como eu faço para incluir um arquivo javaScript em um componente. Eu tenho o arquivo teste.js com que me retorna um quadrado.

function quadrodo(nun){
    return nun * nun;
}
document.write(quadrodo(2) + '<br>');

como eu insiro teste.js dentro do meu componente para que ele me retorne no html do quadrado.component.ts

quadrado.component.ts

import { Component} from '@angular/core';
@Component({
  selector: 'quadrado',
  templateUrl: './quadrado.component.html',
  styleUrls: ['./quadrado.component.styl']
})
export class QuadradoComponent  {

}

Att. Gabriel.

14 respostas
solução!

Você não importa js em um componente. Se você esta criando o código ele deve ser um serviço do Angular. Dai seu código é um método da classe serviço. Daí você injeta o serviço onde quiser.

Ou você pode criar uma classe normal com seu método e importar a classe diretamente e instanciá-la.

Quando chegar na parte de serviço do curso você aprenderá a criar um.

Ok Obrigado.

Vi que você curte Angular, mas sendo um um framework para criar SPA o grau de dificuldade e os problemas que você terá de resolver é 100 vezes maior que uma app web tradicional, além de demandar um conhecimento impecável de Es2015 e dos detalhes de como um browser funciona.

Para saber mais sobre SPA vantagens e desvantagem tem esse podcast aqui.

http://hipsters.tech/single-page-applications-hipsters-16/

Não é para desanima-lo, mas para alertar o terreno que você esta pisando e poder se preparar ainda melhor .

Muito Legal o Link. Obrigado pelas dicas.

Opa Flavio boa tarde tudo bom, me desculpas tantas perguntas, mas é como eu aprendo.

Então seguindo suas explicações eu tentei fazer a injeção de dependências de um serviço de calculo quadrado da seguinte forma.

app/teste/cal.service.ts

import { Component, OnInit } from '@angular/core';
import {Injectable} from '@angular/core';

@Injectable()
export class CalService {
    getCal(){
        function quadrado(num){
            return num * num;
        }    
        document.write(quadrado(6)+'<br>');
    }
}

App/teste/teste.component.ts

import { Component, OnInit } from '@angular/core';
import {CalService} from './cal.service';

@Component({
  selector: 'teste',
  templateUrl: './teste.component.html',
  styleUrls: ['./teste.component.css']
})
export class TesteComponent implements OnInit {
  cal: void; // aqui eu tinha colocado cal: number; mas dá erro Type voide is not assignable to type number
  calService: CalService;


  constructor(_calService: CalService) { 
    // this.calService = new CalService();
    this.calService = _calService;
  }
  ngOnInit() {
  this.cal = this.calService.getCal();    
  }
}

App/tete/teste.component.html

Aqui eu queria imprimir a palavra teste e o valor da conta mas só aparece o numero 36 calculado.

Cheguei a fazer de várias maneiras mas só aparece o valor 36 da conta.

Ande estou errando ?

<h1>Teste</h1>      
<!--tentei de várias formas-->
<ul>
  <li *ngFor="let calculo of cal">
    {{ calculo}}
  </li>
</ul>

OBS: O model foi configurado

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';
import { TesteComponent } from './teste/teste.component';
import {CalService} from './teste/cal.service';

@NgModule({
  declarations: [
    AppComponent,
    TesteComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [CalService],
  bootstrap: [AppComponent]
})
export class AppModule { }

Você misturou alguns conceitos. Vamos revê-los. Por exemplo, document.write não é usado em aplicações, apenas quando estamos começando a programar. É uma saída fácil para exibir algo na tela. Se você usa document esta "matando" o Angular que justamente quer evitar de você manipular o document.

Você definiu um método que define dentro uma função. Aqui a função dentro do método não é usada e nada é retornado. Se você quer o cálculo de quadrado, seu próprio método da classe deve retornar o valor. Veja como está:

export class CalService {

  // isso e um método que declara uma função perdida dentro dele e que usa document.write
    getCal(){
        function quadrado(num){
            return num * num;
        }    
        document.write(quadrado(6)+'<br>');
    }

Agora, modificando seu código, olha como ele deveria ser (eu digo deveria, porque pode ser feito de várias formas):

// call.service.ts
import { Component } from '@angular/core';
import {Injectable} from '@angular/core';

export class CallService {

  // método do serviço que recebe um número e o retorna multiplicando-o por ele mesmo.
    calculaQuadrado(num: number) {
        return num * num;
    }
}
// teste.component.ts
import { Component, OnInit } from '@angular/core';
import { CallService } from './cal.service';

@Component({
  selector: 'teste',
  templateUrl: './teste.component.html',
  styleUrls: ['./teste.component.css']
})
export class TesteComponent {

  private _callService: CallService;

 // injeção do serviço
  constructor(private _calService: CallService) {}

 // o métdo getCalc é o método do componente que pode ser chamado em seu template. Este método chama o método calculaQuarado e retorna seu resultado. Não podemos acessar o serviço diretamente na view porque ele não é um componente, por isso ele é acessado por intermédio de `TesteComponent`.:

  getCalc(num) {

      return this._callService.calculaQuadrado(num);
  }

}

Outro ponto, na sua view você esta usando a diretiva *nFor, ela só faz sentido para percorrer arrays. Array é uma estrutura de dados que pode ter 0 ou mais itens. Em nenum lugar do seu código você possui um array. É isso que me deixou um pouquinho confuso do que você realmente quer. Sendo assim, para funcionar e com o código que escrevi basta fazer:

{{ getCalc(200) }} // exibirá o retorno do serviço.

Veja que você esta chamando diretamente o método getCalc do componente. E este método chama o método do serviço.

Eu vejo no fórum sua vontade em dominar o Angular, aliás, poucas vezes vi alguém tão persistente em aprender determinada tecnologia. Isso é uma qualidade importante em qualquer pessoa que queria se tornar um mestre em determinada tecnologia.

Mas se você me permitir (aguardo sua confirmação) posso indicar uma sequencia de cursos para prepará-lo ainda melhor para o o Angular 2. Topa? Você gastará um tempo maior estudo, mas terá uma base mais firme para consolidar o Angular 2 que na verdade é uma amalgama de várias tecnologias e conceitos de JavaScript.

Aguardo seu retorno

Eu topo sim ....

Eu mandei um bem errado .... a função do for, if, els ,eu entendo bem ... é que as vezes fica dificil explicar... em fim.

Então, vou colocar uma sequencia de cursos. Você pode pular um ou outro caso já domine com segurança o assunto.

1) https://cursos.alura.com.br/course/logica-programacao-pratica-com-desenho-animacoes-em-jogo

Esse aqui, vai além do if e else, ensina a pensar mais no lado funcional do que o primeiro curso. É isso que nos interessa aqui, fixar bem como JavaScript pode se beneficiar de programação funcional.

2) https://cursos.alura.com.br/course/a-linguagem-javascript

JavaScript, a linguagem: aqui você usa JavaScript sem framework..entende manipulação de DOM. Isso é importante porque você só compreende parte da vantagem do Angular quando contrastado com JavaScript puro, sem framework. É o core, a base de tudo.

3)

https://cursos.alura.com.br/course/jquery-a-biblioteca-do-mercado

Esse curso usa jQuery, mas a maneira como o instrutor usa a linguagem JavaScript e organiza a aplicação é obra prima. Se você sentir dificuldade nesse curso, terá dificuldade com Angular 2 em projetos mais complexos. Digamos que ele lhe dará maior bagagem em JavaScript. Inclusive, quando usar Angular, verá como o Angular o torna mais produtivo do queusando jQuery. Mas para ganhar um bom emprego, jQuery é importante saber.

4) https://cursos.alura.com.br/course/javascript-es6-orientacao-a-objetos-parte-1 https://cursos.alura.com.br/course/javascript-es6-orientacao-a-objetos-parte-2 https://cursos.alura.com.br/course/javascript-es6-orientacao-a-objetos-parte-3

Angular 2 usa ES2015 e nesses cursos você ganha uma base da programação orientada à objetos de JavaScript, cria um mini framework e faz na mão o que o Angular faria. Isso o ajudará a entender a motivação de outros frameworks. Mas não é só isso, lembre-se que esse é o pré-requisito do curso de Angular 2. Você fez esse?

Isso o preparará para o Angular 2, mas sendo uma framework de SPA, você precisa ter conhecimentos sólidos de backend para poder construir suas API's. Aqui eu não vou indicar cursos, porque há várias linguagens e cada linguagem tem seu jeito para construir API's.

Com essa sequencial, você estará mais preparando ainda para encarar o Angular 2. Lembre-se, angular 2 é um framework e toda lógica dele é escrita em JavaScript, toda.

O que achou? Ementa justa? Vamos encarar? :) Quero que você se torne um cangaceiro em Angular 2, mas para isso, há um caminho a se traçar. OBS: pode continuar com as dúvidas de Angular 2.. sem problema. Mas se parar e fazer esses cursos, só tem a acrescentar.

Gustavo, alterei o código que postei para você. Tinha uns erros de digitação. Fiz aqui e funcionou.

Aguardo seu retorno.

Aguardo seu retorno.

Opa Flávio obrigado mais uma vez pelo retorno.

O que eu percebo dos cursos do Alura é que eles são mais mão da massa o que é ótimo, mas em termos de teoria, aquelas coisas de vc fazer testes como o que eu estou tentando fazer assim como URI propõem aqui eu não encontro isso, mas encontro fora logo uma coisa complementa a outra.

Isso é o meu ponto de vista.

Eu consegui fazer o service com Arrey para listar cursos em string mas não consegui com o número isso me instigou.

A forma com você me mandou está apresentando o seguinte erro.... segue abaixo.

De qualquer forma obrigado mais uma vez ... vou ver o que eu faço aqui.

error_handler.js:47EXCEPTION: Error in ./AppComponent class AppComponent - inline template:0:7 caused by: self.context.getCalc is not a functionErrorHandler.handleError @ error_handler.js:47(anonymous function) @ application_ref.js:210ZoneDelegate.invoke @ zone.js:232onInvoke @ ng_zone.js:236ZoneDelegate.invoke @ zone.js:231Zone.run @ zone.js:114(anonymous function) @ zone.js:502ZoneDelegate.invokeTask @ zone.js:265onInvokeTask @ ng_zone.js:227ZoneDelegate.invokeTask @ zone.js:264Zone.runTask @ zone.js:154drainMicroTaskQueue @ zone.js:401
error_handler.js:49ORIGINAL EXCEPTION: self.context.getCalc is not a functionErrorHandler.handleError @ error_handler.js:49(anonymous function) @ application_ref.js:210ZoneDelegate.invoke @ zone.js:232onInvoke @ ng_zone.js:236ZoneDelegate.invoke @ zone.js:231Zone.run @ zone.js:114(anonymous function) @ zone.js:502ZoneDelegate.invokeTask @ zone.js:265onInvokeTask @ ng_zone.js:227ZoneDelegate.invokeTask @ zone.js:264Zone.runTask @ zone.js:154drainMicroTaskQueue @ zone.js:401
error_handler.js:52ORIGINAL STACKTRACE:

Olá a lista de cursos é sugestão. É uma sequencial que acho que pode turbinar seu conhecimento. Não sinta-se obrigado a segui-la, apesar deu achar que isso pode torna-lo melhor do que já é em JavaScript. No entanto, o pré-requisito do curso de Angular 2 é o de ES avançado. Esse ajudaria muito.

Voltando ao erro. Eu testei aqui e funcionou perfeito. Pode parecer tedioso, mas cole seu código novamente aqui, depois da alteração. Inclusive seu template para que eu possa ver.

Flávio eu fiz como você fez ...

Deixa depois eu vejo isso.

Blz. Mas a mensagem de erro esta dizendo que o método chamado pela sua Angular Expression (AE) não é uma função. Para o ES2015 todo método e uma classe é uma função. Por isso ver o seu código, do serviço, do componente e o template depois de alterar ajuda a encontrar o problema. Se você fez exatamente igual, pode ser outra coisa da sua aplicação que precisamos ver.

ok