2017-06-12 1 views
0

割り当てのためにサーモスタットアプリを作る必要があります。私と私のグループはイオンの枠組みでこれをしたいと思っています。私はいくつかの助けを借りて、私たちが提供していたapi.jsをイオンポイントで手に入れることができました。しかし、今私は修正する方法がわからないというエラーに遭遇しました。Typescriptはこれを未定義です。タイプ

これは新しいAPI.tsです:私はとの問題を抱えている機能は、それが提供されたサーバからうまくweekProgramを取得しているgetWeekProgram()ある

import * as $ from 'jquery'; 
//import * as http from '@angular/http'; 

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) { 
    return this.requestData(
     "/" + attribute_name, 
     function(data) { 
     return $(data).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); 
    } 
} 

。しかし、このサーバーはXML応答(JSONを取得する方法はありません)を送信しています。this.Program[day] = []行が実行されたときに、次のエラーが表示されます。Runtime Error, this.Program[day] is undefined私はこのエラーを修正する方法の手掛かりがありません..私は行を削除しようとしたとオブジェクトの代わりに大きな配列にプログラムを作ってみましたが、悲しいことに何も働いていません。

これは、我々が取り組んでいるXMLデータである:

<week_program state="off"> 
    <day name="Monday"> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    </day> 
    <day name="Tuesday"> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    </day> 
    <day name="Wednesday"> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    </day> 
    <day name="Thursday"> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    </day> 
    <day name="Friday"> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    </day> 
    <day name="Saturday"> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    </day> 
    <day name="Sunday"> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="night" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    <switch type="day" state="off">00:00</switch> 
    </day> 
</week_program> 

答えて

0

内部関数内部の様々なthis参照はクラスのインスタンスを参照しません。現在のthisは、関数がfunction(){...}構文を使用して宣言されたときには、関数には渡されません。これを行うには、この構文を使用する必要があります:()=>{...}thisの動作の詳細については、in the TypeScript wikiを参照してください。

()=>{...}構文を使用したくない場合は、thisに処理されている項目を参照して.eachを参照する必要があるためです。したがって、クラスインスタンスthisを外部の別の変数に手動で保存する必要があります。そのような変数の一般的な名前はselfです。

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

ありがとうございました! APIは今、完全に動作しています; Dありがとうございます!!さて、私たちは最終的にデザインの部分から始めることができます(これがこのテーマ全体についてです....) –

関連する問題