6

में सेवाओं में सेवाओं को इंजेक्शन करते समय निर्भरता के लिए पैरामीटर कैसे पास करें I टाइपोग्राफी में आयनिक 2 में किसी वेबसाकेट सर्वर से कनेक्शन बनाने के लिए नमूना अनुप्रयोग बना रहे हैं। repoकोणीय 2 (आयनिक 2/कोणीय 2/टाइपस्क्रिप्ट)

मेरे आवश्यकता के लिए लिंक आवेदन के दौरान WebSocket कनेक्शन कनेक्शन बनाने के लिए

मैं angular2-websocket उपयोग कर रहा हूँ शुरू करना है।

संदर्भ:

  1. http://blog.thoughtram.io/angular/2015/09/17/resolve-service-dependencies-in-angular-2.html

  2. http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html

मैं एक त्रुटि मिल रही है "के लिए सभी मापदंडों को हल नहीं किया जा सकता '$ WebSocket' (? स्ट्रिंग, सरणी,) सुनिश्चित करें कि सभी पैरामीटर इंजेक्ट के साथ सजाए गए हैं या वैध टाइप एनोटेशन हैं और '$ WebSocket' इंजेक्शन के साथ सजाया गया है। "

कोड: app.ts

import {App, Platform} from 'ionic-framework/ionic'; 
import {TabsPage} from './pages/tabs/tabs'; 
import {ConnectionService} from './framework/connection/connection-service' 
import {$WebSocket} from 'angular2-websocket/angular2-websocket'; 
import {bootstrap} from 'angular2/platform/browser'; 

// https://angular.io/docs/ts/latest/api/core/Type-interface.html 
import {Type} from 'angular2/core'; 


@App({ 
    template: '<ion-nav [root]="rootPage"></ion-nav>', 
    config: {} 
}) 
export class MyApp { 
    rootPage: Type = TabsPage; 

    constructor(platform: Platform, private conn : ConnectionService) { 
    platform.ready().then(() => { 
     this.conn.connect(); 
    }); 
    } 
} 
bootstrap(MyApp, [$WebSocket, ConnectionService]); 

connection-service.ts

import {Injectable, Component, Inject} from 'angular2/core'; 
import {$WebSocket} from 'angular2-websocket/angular2-websocket'; 
import {bootstrap} from 'angular2/platform/browser'; 

@Injectable() 
export class ConnectionService { 

    private _status: number; 

    //private connection: $WebSocket; 

    constructor(private connection : $WebSocket = new $WebSocket("ws://echo.websocket.org")) { 

    console.log("Starting connection"); 

    //this.connection = new $WebSocket("ws://echo.websocket.org"); 

    this.connection.onClose(this.onCloseHandler); 
    this.connection.onError(this.onErrorHandler); 
    this.connection.onOpen(this.onOpenHandler); 
    this.connection.onMessage(this.onRecieveHandler, {}); 

} 
... 
public connect() { 
    this.connection.connect(true); 
} 
... 
} 
bootstrap(ConnectionService, [$WebSocket]); 

उत्तर

4

मेरी समस्या का समाधान करने के बजाय @App() व्याख्या की (विशिष्ट आयनिक को) प्रदाता क्षेत्र उपयोग कर रहा था बूटस्ट्रैप

bootstrap(ConnectionService, 
    [provide($WebSocket, useValue: new WebSocket("ws://echo.websocket.org")]); 

उदाहरण का उपयोग करते हुए।

@App({ 
    template: '<ion-nav [root]="rootPage"></ion-nav>', 
    config: {}, 
    providers : [ provide($WebSocket, { useValue: new $WebSocket("ws://echo.websocket.org") }), ConnectionService] 
}) 

कार्य नमूना पाया जा सकता है here

+0

'@App()' है एक आयनिक विशिष्ट एनोटेशन? –

+1

@Gunter हाँ आईओनिक के लिए इसका विशिष्ट है। 'आयनिक-फ्रेमवर्क/आयनिक' से आयात किया जा सकता है; – tymspy

+0

इसका मतलब है कि आपको Ionic2 ऐप्स @tymSpy में बूटस्ट्रैप की आवश्यकता नहीं है? –

2

जाहिर $WebSocket की आवश्यकता है एक string, array और एक अन्य पैरामीटर जो $WebSocket इंजेक्शन नहीं, कम से कम सीधे नहीं बनाता है।

समाधान के लिए आप उपयोग कर सकते

import {Injectable, Component, Inject, provide} from 'angular2/core'; 

bootstrap(ConnectionService, 
    [provide($WebSocket, { useValue: new $WebSocket("ws://echo.websocket.org") })]); 

अन्य विकल्प हैं अगर स्ट्रिंग शाब्दिक नहीं है आप क्या चाहते हैं, एक कारखाने की तरह।

+0

@tymspy, फिक्सिंग के लिए धन्यवाद! मैं केवल डार्ट का उपयोग कर रहा हूं और अक्सर वाक्यविन्यास मतभेदों को भूल जाता हूं। –

0

जो मैं देखता हूं, उससे आपको $WebSocket इंजेक्शन द्वारा प्रदान करना चाहिए क्योंकि आप इसे अपनी सेवा के लिए स्वयं द्वारा तत्काल बनाते हैं। मैं bootstrap से हटाने और निर्माता में यह बजाय का दृष्टांत निर्माता मापदंडों से यह प्रदान करने का होगा:

@Injectable() 
export class ConnectionService { 
    private _status: number; 
    private connection: $WebSocket; 

    constructor() { 
    this.connection = new $WebSocket("ws://echo.websocket.org"); 
    } 
} 

जिसके अनुसार, सामान्य रूप में, यदि आप कोणीय में निर्भरता इंजेक्शन लाभ उठाने के लिए चाहते हैं, आप Angular2 द्वारा दृष्टांत जाने चाहिए स्वयं चीजें जिन्हें आप निर्माता में इंजेक्ट करना चाहते हैं।

आपके मामले में, Angular2 आपके $WebSocket सेवा को तुरंत चालू करने का प्रयास करता है। मुझे लगता है कि इसका कन्स्ट्रक्टर तीन मानकों को स्वीकार करता है और जब कोणीय 2 इन पैरामीटर को तत्काल स्तर पर हल करने का प्रयास करता है। यह अंतिम को हल नहीं कर सकता है। क्या आप $WebService कन्स्ट्रक्टर के पैरामीटर प्रदान कर सकते हैं?

+0

यूआरएल: स्ट्रिंग, प्रोटोकॉल?: ऐरे , कॉन्फ़िगरेशन ?: WebSocketConfig। अंतिम दो वैकल्पिक हैं। – tymspy

+1

वास्तव में 'WebSocketConfig' ऐसा कुछ है जो Angular2 हल नहीं कर सकता है। यदि आप निर्भरता इंजेक्शन के साथ '$ WebSocket' का उपयोग करना चाहते हैं, तो आपको इसके लिए एक प्रदाता सेट करना होगा: 'प्रदान करें (WebSocketConfig, useValue: new WebSocketConfig (...)' लेकिन मुझे लगता है कि आपको स्ट्रिंग पैरामीटर के साथ समस्या होगी .. –

+0

टिप के लिए धन्यवाद। मैंने ऐप सजावटकर्ताओं के साथ बूटस्ट्रैप के बजाय एनोटेशनर्स प्रदाताओं का उपयोग किया ($ वेबसॉकेट, उपयोग वैल्यू: नई वेबसॉकेट ("ws: //echo.websocket.org") ने मेरी समस्या हल की – tymspy

संबंधित मुद्दे