2015-12-21 11 views
37

मैं AngularJS 2 बीटा 0 का उपयोग कर रहा हूं और मैं विंडो ऑब्जेक्ट पर किसी ईवेंट से RxJS ऑब्जर्जेबल बनाने की कोशिश कर रहा हूं। मेरा मानना ​​है कि मैं अपने सेवा में एक नमूदार के रूप में घटना पर कब्जा करने के लिए सूत्र जानते हैं:Angular2 RxJS 'Observable_1.Observable.fromEvent एक फ़ंक्शन नहीं है' त्रुटि

var observ = Observable.fromEvent(this.windowHandle, 'hashchange'); 

समस्या यह है कि हर बार जब मैं इस कोड को चलाने का प्रयास करें, मैं यह बताते हुए कि 'fromEvent' कार्य नहीं है कोई त्रुटि मिलती है।

Uncaught EXCEPTION: Error during evaluation of "click" 
ORIGINAL EXCEPTION: TypeError: Observable_1.Observable.fromEvent is not a function 

यह मेरे लिए मतलब है कि मैं कोणीय 2 के निर्माण में सही ढंग से अब है कि RxJS शामिल नहीं है मेरी import से निपटने नहीं कर रहा हूँ, हालांकि अपने आवेदन कार्यों के बाकी ठीक से, जो मेरे लिए है कि RxJS का मतलब है लगता है वह जगह है जहां यह माना जाता है।

सेवा में मेरे आयात इस तरह दिखता है:

import {Observable} from 'rxjs/Observable'; 

हालांकि मैं भी इस के बजाय एक ही परिणाम के साथ, (कोड में उपयुक्त बदलाव के साथ) का उपयोग करने की कोशिश की है:

import {FromEventObservable} from 'rxjs/observable/fromEvent'; 

मैं अपने Index.html में निम्नलिखित विन्यास है:

<script> 
    System.config({ 
     map: { 
      rxjs: 'node_modules/rxjs' 
     }, 
     packages: { 
      'app': {defaultExtension: 'js'}, 
      'rxjs': {defaultExtension: 'js'} 
     } 
    }); 
    System.import('app/app'); 
</script> 

किसी मुझे बता सकते हैं क्या मैं गलत तरीके से कर रहा हूँ?

उत्तर

66

समस्या यह है कि आयात बयान इस तरह दिखना चाहिए लग रहा था:

import {Observable} from 'rxjs/Rx'; 

ध्यान दें कि Observablerxjs/Rx से बजाय rxjs/Observable से लाया जा रहा है। As @EricMartinez mentions, इसे इस तरह से खींचने से स्वचालित रूप से आप सभी ऑपरेटरों (जैसे .map()) प्राप्त करेंगे।

+9

हम आरएक्सजे से सबकुछ क्यों जोड़ते हैं, क्या हम केवल आवश्यक हिस्सों को जोड़ नहीं सकते –

+0

@ महमूदहबौबाती हां आप केवल आवश्यक हिस्सों में ला सकते हैं। नीचे दिए गए उत्तर को देखें .. चीजों को आयात करने का सही तरीका कौन सा है ताकि आप अपनी संपत्ति बंडल को न फेंक सकें। – SgtPooki

+2

यह अनुशंसित उपयोग नहीं है .. आपको कभी भी सभी ऑपरेटरों को आयात नहीं करना चाहिए (इस प्रकार कभी भी 'आरएक्सजेएस/आरएक्स' – Mackelito

76

यह निश्चित रूप से सभी ऑपरेटरों को एक बार आयात करने की आवश्यकता नहीं है! आपने अभी fromEvent गलत आयात किया है। क्या मैं पहले से ही लिखा addititon में: आप इस तरह यह कर सकता है:

import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/observable/fromEvent'; 

संपादित कोणीय की AOT-संकलक के साथ पेड़ हिला अप्रयुक्त कोड निकाल देता है, आप क्या आयात पर आधारित है। यदि आप rxjs/rx से कुछ ऑब्जेक्ट्स या फ़ंक्शंस आयात करते हैं, तो कंपाइलर कुछ भी नहीं हटा सकता है। हमेशा आयात करें, आपको क्या चाहिए!

+3

ध्यान दें कि आपको पूंजीकरण करना है Rxjs/Observable में 'ओ'। मैंने इस त्रुटि को हमेशा के लिए देखा। –

+2

यह बेहतर जवाब है। सभी आरएक्सजे आयात करना निश्चित रूप से आपके स्टार्टअप समय को धीमा कर देगा। – ccnokes

+0

यह निश्चित रूप से बेहतर समाधान है, भले ही @ माइकल_ऑरील इसे हल करता है। – seangwright

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