2016-10-17 7 views
1

私はTypescriptを使い慣れていて、Angular2を使ってWeb Midiアプリを作成しようとしていますが、特定のエラーを理解するのに苦労しています。私はミディ機能をサービスの中に入れなければならないと思っていますが、私が間違っていれば私を修正します。Angular2とWeb Midi

作品以下の例、ミディ変数とonMIDIMessage機能は外

var midi:any; 

function onMIDIMessage(event) { 
     console.log("msg received", event); 
} 

export class MidiService { 

    onMidiInit() { 
     if (navigator.requestMIDIAccess) { 
      navigator.requestMIDIAccess({ 
       sysex: false 
      }).then(this.onMIDISuccess, this.onMIDIFailure); 
     } else { 
      alert("No MIDI support in your browser."); 
     } 
    } 

    onMIDISuccess(midiAccess) { 
     console.log('MIDI Access Object', midiAccess); 
     midi = midiAccess; 
     console.log(midi); 

     var inputs = midi.inputs.values(); 
     for (var input = inputs.next(); input && !input.done; input = inputs.next()) { 
      input.value.onmidimessage = onMIDIMessage; 
     } 

    } 

    onMIDIFailure(e) { 
     console.log(e); 
    } 
} 

すべてが良いですし、私はこれで入力されるMIDIメッセージをプリントアウトすることができます。しかし、私が理解できないことは、onMIDIMessage関数とmidi変数がMidiServiceクラスの内部にある場合、Chromeはエラーをスローするということです。なぜそれが起こっているのですか?

midi.service.ts:24 Uncaught (in promise) TypeError: Cannot read property >'onMIDIMessage' of undefined at MidiService.onMIDISuccess (http://localhost:3000/app/midi.service.js:27:57)

var midi:any; 

// Code that does not work 
export class MidiService { 

    onMidiInit() { 
     if (navigator.requestMIDIAccess) { 
      navigator.requestMIDIAccess({ 
       sysex: false 
      }).then(this.onMIDISuccess, this.onMIDIFailure); 
     } else { 
      alert("No MIDI support in your browser."); 
     } 
    } 

    onMIDISuccess(midiAccess) { 
     console.log('MIDI Access Object', midiAccess); 
     midi = midiAccess; 
     console.log(midi); 

     var inputs = midi.inputs.values(); 
     for (var input = inputs.next(); input && !input.done; input = inputs.next()) { 
      input.value.onmidimessage = this.onMIDIMessage; 
     } 

    } 

    onMIDIMessage(event) { 
     console.log("msg received", event); 
    } 

    onMIDIFailure(e) { 
     console.log(e); 
    } 
} 

--- EDIT

方法がapp.component.tsファイルで呼び出されます。

import {Component} from 'angular2/core'; 
import {MidiService} from './midi.service'; 

@Component({ 
    selector: 'my-app', 
    template: '<h1>My First Angular 2 App</h1>', 
    providers: [MidiService] 
}) 
export class AppComponent { 
    constructor(midiService: MidiService) { 
     midiService.onMidiInit(); 
    } 
} 
+0

どのように、どこからと呼ばれている:あなたは、コールバックとして現在のクラスのメソッドを渡すとき

.bind(this)を追加しますか? –

+0

MidiServiceクラスが初期化されると、コンピュータに接続されているMIDIデバイスからの着信MIDIメッセージがあるたびに、onMIDIMessageが呼び出されます。 – jmstoh

答えて

1

thisは現在のクラスインスタンスを指していません。これらの方法は

input.value.onmidimessage = this.onMIDIMessage.bind(this); 
+0

ありがとう!しかし、クロムはまだコンソールにこのエラーをスローしています: – jmstoh

+0

midi.service.ts:23 Uncaught(約束)TypeError:未定義のプロパティ 'onMIDIMessage'を読み取ることができません – jmstoh

+0

'}}に追加しましたか?then this.onMIDISuccess (this.onMIDIFailure.bind(this)); '? 'のようにします。 –