2017-06-08 2 views
2

Ich habe versucht, eine gegebene .js API in einem ionischen 3 Projekt zu verwenden. Mit etwas Hilfe konnte ich die API fehlerfrei in das Projekt bringen und kann nun die Funktionen nutzen, die es hat. Allerdings verwendet die API JQuery 2.1.0 und jetzt beim Kompilieren des Projekts bekomme ich den folgenden Fehler: Cannot write file '.../src/assets/jquery-2.1.0.min.js' because it would overwrite input file. Ich habe keine Ahnung, wie Sie das beheben .. Ich habe versucht, die JQuery-Datei als Modul zu importieren, aber das gibt mir auch einige Fehler. Sowohl die api.ts als auch jquery-2.1.0.min.js befinden sich im Ordner src/assets/ und dann wird die API in meine src/pages/home/home.ts Datei importiert.Typescript Kann keine Datei schreiben, würde die Eingabedatei überschreiben. Fehler beim Kompilieren der Ionic 3 App

Dies ist die api.ts:

import * as $ from './jquery-2.1.0.min.js'; 

export class API { 
    ServerUrl = ''; 

    Type = { 
    Day: 'day', 
    Night: 'night' 
    }; 

    Days = { 
    Monday: 'Monday', 
    Tuesday: 'Tuesday', 
    Wednesday: 'Wednesday', 
    Thursday: 'Thursday', 
    Friday: 'Friday', 
    Saturday: 'Saturday', 
    Sunday: 'Sunday' 
    }; 

    MinTemperature = parseFloat('5.0'); 
    MaxTemperature = parseFloat('30.0'); 
    MaxSwitches = 5; 

    Time; 
    CurrentDay; 
    DayTemperature; 
    NightTemperature; 
    CurrentTemperature; 
    TargetTemperature; 
    ProgramState; 

    Program:any = {}; 

    constructor() { 
    this.Program[this.Days.Monday] = []; 
    this.Program[this.Days.Tuesday] = []; 
    this.Program[this.Days.Wednesday] = []; 
    this.Program[this.Days.Thursday] = []; 
    this.Program[this.Days.Friday] = []; 
    this.Program[this.Days.Saturday] = []; 
    this.Program[this.Days.Sunday] = []; 
    } 

    /* Retrieve day program 
    */ 
    getProgram(day) { 
    return this.Program[day]; 
    } 

    /* Sorts the heating periods (the periods when the heating is on) and merges overlapping ones 
    */ 
    sortMergeProgram(day) { 
    let program = this.getProgram(day); 
    program.sort(function(a, b) { 
     return this.parseTime(a[0]) - this.parseTime(b[0]) 
    }); 
    for (let i = 0; i < program.length - 1; i++) { 
     if (this.parseTime(program[i][1]) >= this.parseTime(program[i + 1][0])) { 
     let start = (program[i][0]); 
     let end = (this.parseTime(program[i][1]) > this.parseTime(program[i + 1][1])) ? program[i][1] : program[i + 1][1]; 
     program.splice(i, 2); 
     program.push([start, end]); 
     this.sortMergeProgram(day); 
     break; 
     } 
    } 
    } 

    /* Retrieves all data from the server except for weekProgram 
    */ 
    get(attribute_name, xml_tag) { 
    return this.requestData(
     "/" + attribute_name, 
     function(data) { 
     return $(data).find(xml_tag).text(); 
     } 
    ); 
    } 

    /* Retrieves the week program 
    */ 
    getWeekProgram() { 
    return this.requestData(
     '/weekProgram', 
     function(data) { 
     $(data).find('day').each(function() { 
      let day = (<any>$(this)).attr('name'); 
      this.Program[day] = []; 
      $(this).find('switch').each(function() { 
      if ((<any>$(this)).attr('state') == 'on') { 
       if ((<any>$(this)).attr('type') == this.Type.Day) { 
       this.getProgram(day).push([$(this).text(), '00:00']); 
       } else { 
       this.getProgram(day)[this.getProgram(day).length - 1][1] = $(this).text(); 
       } 
      } 
      }) 
     }); 
     return this.Program; 
     } 
    ); 
    } 

    /* Uploads all data to the server except for currentTemperature and weekProgram 
    */ 
    put(attribute_name, xml_tag, value) { 
    this.uploadData("/" + attribute_name, "<" + xml_tag + ">" + value + "</" + xml_tag + ">"); 
    } 

    requestData(address, func) { 
    let result; 
    (<any>$).ajax({ 
     type: "get", 
     url: this.ServerUrl + address, 
     dataType: "xml", 
     async: false, 
     success: function(data) { 
     result = func(data); 
     } 
    }); 
    return result; 
    } 

    /* Uploads the week program 
    */ 
    setWeekProgram() { 
    let doc = document.implementation.createDocument(null, null, null); 
    let program = doc.createElement('week_program'); 
    program.setAttribute('state', this.ProgramState ? 'on' : 'off'); 
    for (let key in this.Program) { 
     let day = doc.createElement('day'); 
     day.setAttribute('name', key); 

     let daySwitches = []; 
     let nightSwitches = []; 

     let i, text, sw; 
     let periods = this.getProgram(key); 
     for (i = 0; i < periods.length; i++) { 
     daySwitches.push(periods[i][0]); 
     nightSwitches.push(periods[i][1]); 
     } 

     for (i = 0; i < this.MaxSwitches; i++) { 
     sw = doc.createElement('switch'); 
     sw.setAttribute('type', this.Type.Day); 

     if (i < daySwitches.length) { 
      sw.setAttribute('state', 'on'); 
      text = doc.createTextNode(daySwitches[i]); 
     } else { 
      sw.setAttribute('state', 'off'); 
      text = doc.createTextNode('00:00'); 
     } 
     sw.appendChild(text); 
     day.appendChild(sw); 
     } 

     for (i = 0; i < this.MaxSwitches; i++) { 
     sw = doc.createElement('switch'); 
     sw.setAttribute('type', this.Type.Night); 

     if (i < nightSwitches.length) { 
      sw.setAttribute('state', 'on'); 
      text = doc.createTextNode(nightSwitches[i]); 
     } else { 
      sw.setAttribute('state', 'off'); 
      text = doc.createTextNode('00:00'); 
     } 
     sw.appendChild(text); 
     day.appendChild(sw); 
     } 
     program.appendChild(day); 
    } 
    doc.appendChild(program); 
    this.uploadData('/weekProgram', (new XMLSerializer()).serializeToString(doc)); 
    } 

    /* Creates the default week program 
    */ 
    setDefault() { 
    let doc = document.implementation.createDocument(null, null, null); 
    let program = doc.createElement('week_program'); 
    program.setAttribute('state', this.ProgramState ? 'on' : 'off'); 
    for (let key in this.Program) { 
     let day = doc.createElement('day'); 
     day.setAttribute('name', key); 

     let daySwitches = []; 
     let nightSwitches = []; 

     let i, text, sw; 

     for (i = 0; i < this.MaxSwitches; i++) { 
     sw = doc.createElement('switch'); 
     sw.setAttribute('type', this.Type.Night); 
     sw.setAttribute('state', 'off'); 
     text = doc.createTextNode('00:00'); 
     sw.appendChild(text); 
     day.appendChild(sw); 
     } 

     for (i = 0; i < this.MaxSwitches; i++) { 
     sw = doc.createElement('switch'); 
     sw.setAttribute('type', this.Type.Day); 
     sw.setAttribute('state', 'off'); 
     text = doc.createTextNode('00:00'); 
     sw.appendChild(text); 
     day.appendChild(sw); 
     } 

     program.appendChild(day); 
    } 
    doc.appendChild(program); 
    this.uploadData('/weekProgram', (new XMLSerializer()).serializeToString(doc)); 
    } 

    uploadData(address, xml) { 
    (<any>$).ajax({ 
     type: "put", 
     url: this.ServerUrl + address, 
     contentType: 'application/xml', 
     data: xml, 
     async: false 
    }); 
    } 

    parseTime(t) { 
    return parseFloat(t.substr(0, 2)) + parseFloat(t.substr(3, 2))/60; 
    } 

    /* Adds a heating period for a specific day 
    */ 
    addPeriod(day, start, end) { 
    let program = this.getWeekProgram()[day]; 
    program.push([start, end]); 
    this.sortMergeProgram(day); 
    this.setWeekProgram(); 
    } 

    /* Removes a heating period from a specific day. 
    idx is the idex of the period with values from 0 to 4 
    */ 
    removePeriod(day, idx) { 
    let program = this.getWeekProgram()[day]; 
    let start = program[idx][0]; 
    let end = program[idx][1]; 
    program.splice(idx, 1); 
    this.setWeekProgram(); 
    } 

    /* Checks whether the temperature is within the range [5.0,30.0] 
    */ 
    inTemperatureBoundaries(temp) { 
    temp = parseFloat(temp); 
    return (temp >= this.MinTemperature && temp <= this.MaxTemperature); 
    } 
} 

Und das ist die jquery-2.1.0.js, die zur Verfügung gestellt wurden (Pastebin Link, da die Datei zu groß ist, ist es sehr groß).

Ich habe bereits meine tsconfig.json bearbeitet, um auch "allowJs"= true, drin zu haben.

Gibt es jemanden, der weiß, wie ich das beheben könnte?

Vielen Dank im Voraus!

Antwort

1

ich es geschafft, dieses Problem zu beheben, indem nicht die Verwendung von jQuery .js-Datei, sondern durch Importieren von jquery. Nach diesem Tutorial: https://x-team.com/blog/include-javascript-libraries-in-an-ionic-2-typescript-project/, aber stattdessen die jquery-2.1.0-Version von npm! Nachdem ich gerade jquery auf folgende Weise importiert habe: import * as $ from 'jquery'; und alles funktioniert gut !!

+0

verwende es nicht. Ernsthaft, wenn es keinen Import jQuery hat, dann finden Sie etwas anderes, das ist ein schwerer Bit Extra-Code für eine mobile App –

+0

Es ist für eine Schulaufgabe, in der ich ** diese API verwenden muss. Wenn dies eine echte App wäre, würde ich öffentlich dies nicht verwenden oder die gesamte API selbst schreiben, aber diese ganze Aufgabe konzentriert sich auf Benutzeroberflächen. Die Funktionalität ist nur vorhanden, damit die Professoren es testen können. Und da es nur um die Schnittstelle geht, habe ich das Gefühl, dass ich schon viel mehr Zeit auf der API verbracht habe als nötig. Wenn das jetzt funktioniert, bin ich mehr als zufrieden damit. –

0

Sieht aus wie ein Problem mit den Typoskript-Deklarationsdateien (.d.ts), die den Compiler verwirren.

Erster Lauf dieser Befehl alle alten Erklärung zu löschen Dateien die tsc erzeugt hat:

find . -type f -name "*.d.ts" -delete 

Dann wird Ihr tsconfig.json ändern zu haben

"compilerOptions": { 
    "declaration": false, 
    ... 
} 
+0

Ich bin auf Windows, so dass der Befehl nicht funktioniert, manuell nach allen * .d.ts-Dateien suchen und und löscht sie in der 'can not find module" /.build "' Fehler. –

Verwandte Themen