ฉันจะรวมไฟล์สคริปต์ JavaScript ใน Angular และเรียกใช้ฟังก์ชันจากสคริปต์นั้นได้อย่างไร


119

ฉันมีไฟล์ JavaScript เรียกว่าabc.jsที่มีฟังก์ชั่น 'สาธารณะ' xyz()ที่เรียกว่า ฉันต้องการเรียกใช้ฟังก์ชันนั้นในโครงการเชิงมุมของฉัน ฉันจะทำอย่างไร?

คำตอบ:


105

อ้างถึงสคริปต์ภายในไฟล์angular-cli.json( angular.jsonเมื่อใช้ angular 6+)

"scripts": [
    "../path" 
 ];

จากนั้นเพิ่มtypings.d.ts(สร้างไฟล์นี้srcหากยังไม่มีอยู่)

declare var variableName:any;

นำเข้าในไฟล์ของคุณเป็นไฟล์

import * as variable from 'variableName';

9
ฉันเพิ่มเส้นทางในสคริปต์เป็น "scripts": ["./assets/common_header_sidebar.js"]; จากนั้นในการพิมพ์ d.ts ฉันเขียนประกาศ var commonHeader: any; จากนั้นในไฟล์ ts ของฉันฉันเขียน import * เป็น commonHeaderModule จาก 'commonHeader'; แต่ได้รับ "ไม่พบโมดูล" commonHeader " ข้อผิดพลาด
Piyush Jain

6
ฉันอาจฟังดูโง่ที่ถามสิ่งนี้ แต่ชื่อไฟล์ในพา ธ (ประกาศใน angular-cli.json) และการประกาศชื่อของอ็อบเจ็กต์ในไฟล์พิมพ์ d.ts เกี่ยวข้องกันอย่างไร เนื่องจากฉันนำเข้าจากชื่อของวัตถุที่ประกาศไม่ใช่ไฟล์
Piyush Jain

2
คุณสามารถสร้างplunkerเพื่อสร้างซ้ำได้ไหม
Aravind

2
เสร็จสิ้นด้วยการรวมมันเป็นเพียงการที่ฉันต้องประกาศฟังก์ชันในไฟล์ ts ของฉันซึ่งฉันใช้งานอยู่และไม่จำเป็นต้องนำเข้า ขอบคุณมาก
Piyush Jain

2
@Aravind จะทำอย่างไรถ้าฉันไม่มีไฟล์พิมพ์.d.tsในโครงการ Angular 4 ของฉัน
Habib

34

ในการรวมไลบรารีส่วนกลางเช่นjquery.jsไฟล์ในอาร์เรย์สคริปต์จากangular-cli.json( angular.jsonเมื่อใช้เชิงมุม 6+):

"scripts": [
  "../node_modules/jquery/dist/jquery.js"
]

หลังจากนี้ให้รีสตาร์ท ng ให้บริการหากเริ่มต้นแล้ว


3
คุณนำเข้าไฟล์ typescript ได้อย่างไร?
alansiqueira27

1
เพื่อนำเข้าในไฟล์ ts -declare var $: any;
ojus kulkarni

3
ไฟล์ angular-cli.json ถูกเปลี่ยนชื่อ / แทนที่ด้วย angular.json ในเวอร์ชัน 6+ ของ Angular
ΕГИІИО

22

เพิ่มไฟล์ js ภายนอกindex.html

<script src="./assets/vendors/myjs.js"></script>

นี่คือไฟล์myjs.js :

var myExtObject = (function() {

    return {
      func1: function() {
        alert('function 1 called');
      },
      func2: function() {
        alert('function 2 called');
      }
    }

})(myExtObject||{})


var webGlObject = (function() { 
    return { 
      init: function() { 
        alert('webGlObject initialized');
      } 
    } 
})(webGlObject||{})

จากนั้นประกาศว่าอยู่ในส่วนประกอบดังต่อไปนี้

demo.component.ts

declare var myExtObject: any;
declare var webGlObject: any;

constructor(){
    webGlObject.init();
}

callFunction1() {
    myExtObject.func1();
}

callFunction2() {
    myExtObject.func2();
}

demo.component.html

<div>
    <p>click below buttons for function call</p>
    <button (click)="callFunction1()">Call Function 1</button>
    <button (click)="callFunction2()">Call Function 2</button>
</div>

มันทำงานให้ฉัน ...


ขอบคุณตัวอย่างที่ละเอียดมากมันได้ผลสำหรับฉันในเชิงมุม 6 คำตอบอื่น ๆ ไม่ได้ผล
Daniel Filipe

FWIW, ที่นี่มีคำอธิบายของสิ่งบางอย่างdeclareไม่ - หลัก " declareจะใช้ในการบอกว่า typescript ตัวแปรได้ถูกสร้างขึ้นที่อื่น ๆ " (จากคำตอบนี้ )
ruffin

18

คุณสามารถทำได้

import * as abc from './abc';
abc.xyz();

หรือ

import { xyz } from './abc';
xyz()

27
ฉันควรทำอย่างไรเมื่อไฟล์ถูกโฮสต์ไว้ที่ใดที่หนึ่ง แต่ไม่ได้อยู่ใน repo ในเครื่อง
Piyush Jain

คุณคิดออกหรือไม่
Luis Aceituno

รับข้อผิดพลาดในทั้งสองวิธี ฉันมีไฟล์. js ในโปรเจ็กต์ของฉัน แต่เมื่อฉันนำเข้าด้วยวิธีแรกมันทำให้ฉันเกิดข้อผิดพลาดในการคอมไพล์และไม่พบโมดูลใด ๆ เมื่อฉันใช้วิธีที่สอง และฉันใช้แค่แถบเลื่อน
Habib
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.