2016-12-31 58 views
1

我有以下幾點:combineLatest誤差值

static phones: Map<number, {}> = new Map<number, {}>(); 
... 

    Observable.combineLatest(
     this.form.statusChanges, 
     this.form.valueChanges, 
     (status, value) => ({ status, value })) 
       .debounceTime(500) 
       .subscribe(
        ({ status, value }) => { 

         PhoneComponent.phones.set(this.rowIndex, value); 
} 

當窗體變爲有效的第一次,地圖值設定,沒有任何問題。但是,如果我要在表格上值再次改變我得到的異常以下(PhoneComponent是正在使用combineLatest我的自定義組件)

Angular 2 is running in the development mode. Call enableProdMode() to enable the production mode. 
error_handler.js:47 EXCEPTION: PhoneComponent_1.phones.set is not a function 
ErrorHandler.handleError @ error_handler.js:47 
next @ application_ref.js:272 
schedulerFn @ async.js:82 
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223 
SafeSubscriber.next @ Subscriber.js:172 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
Subject.next @ Subject.js:55 
EventEmitter.emit @ async.js:74 
NgZone.triggerError @ ng_zone.js:278 
onHandleError @ ng_zone.js:257 
ZoneDelegate.handleError @ zone.js:236 
Zone.runTask @ zone.js:157 
ZoneTask.invoke @ zone.js:335 
data.args.(anonymous function) @ zone.js:970 
error_handler.js:52 ORIGINAL STACKTRACE: 
ErrorHandler.handleError @ error_handler.js:52 
next @ application_ref.js:272 
schedulerFn @ async.js:82 
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223 
SafeSubscriber.next @ Subscriber.js:172 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
Subject.next @ Subject.js:55 
EventEmitter.emit @ async.js:74 
NgZone.triggerError @ ng_zone.js:278 
onHandleError @ ng_zone.js:257 
ZoneDelegate.handleError @ zone.js:236 
Zone.runTask @ zone.js:157 
ZoneTask.invoke @ zone.js:335 
data.args.(anonymous function) @ zone.js:970 
error_handler.js:53 TypeError: PhoneComponent_1.phones.set is not a function 
    at SafeSubscriber.__WEBPACK_IMPORTED_MODULE_2_rxjs__.Observable.combineLatest.debounceTime.subscribe [as _next] (phone.component.ts:137) 
    at SafeSubscriber.__tryOrUnsub (Subscriber.js:223) 
    at SafeSubscriber.next (Subscriber.js:172) 
    at Subscriber._next (Subscriber.js:125) 
    at Subscriber.next (Subscriber.js:89) 
    at DebounceTimeSubscriber.debouncedNext (debounceTime.js:98) 
    at AsyncAction.dispatchNext (debounceTime.js:114) 
    at AsyncAction._execute (AsyncAction.js:111) 
    at AsyncAction.execute (AsyncAction.js:86) 
    at AsyncScheduler.flush (AsyncScheduler.js:36) 
ErrorHandler.handleError @ error_handler.js:53 
next @ application_ref.js:272 
schedulerFn @ async.js:82 
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223 
SafeSubscriber.next @ Subscriber.js:172 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
Subject.next @ Subject.js:55 
EventEmitter.emit @ async.js:74 
NgZone.triggerError @ ng_zone.js:278 
onHandleError @ ng_zone.js:257 
ZoneDelegate.handleError @ zone.js:236 
Zone.runTask @ zone.js:157 
ZoneTask.invoke @ zone.js:335 
data.args.(anonymous function) @ zone.js:970 
phone.component.ts:137 Uncaught TypeError: PhoneComponent_1.phones.set is not a function 
    at SafeSubscriber.__WEBPACK_IMPORTED_MODULE_2_rxjs__.Observable.combineLatest.debounceTime.subscribe [as _next] (phone.component.ts:137) 
    at SafeSubscriber.__tryOrUnsub (Subscriber.js:223) 
    at SafeSubscriber.next (Subscriber.js:172) 
    at Subscriber._next (Subscriber.js:125) 
    at Subscriber.next (Subscriber.js:89) 
    at DebounceTimeSubscriber.debouncedNext (debounceTime.js:98) 
    at AsyncAction.dispatchNext (debounceTime.js:114) 
    at AsyncAction._execute (AsyncAction.js:111) 
    at AsyncAction.execute (AsyncAction.js:86) 
    at AsyncScheduler.flush (AsyncScheduler.js:36) 
__WEBPACK_IMPORTED_MODULE_2_rxjs__.Observable.combineLatest.debounceTime.subscribe @ phone.component.ts:137 
SafeSubscriber.__tryOrUnsub @ Subscriber.js:223 
SafeSubscriber.next @ Subscriber.js:172 
Subscriber._next @ Subscriber.js:125 
Subscriber.next @ Subscriber.js:89 
DebounceTimeSubscriber.debouncedNext @ debounceTime.js:98 
dispatchNext @ debounceTime.js:114 
AsyncAction._execute @ AsyncAction.js:111 
AsyncAction.execute @ AsyncAction.js:86 
AsyncScheduler.flush @ AsyncScheduler.js:36 
ZoneDelegate.invokeTask @ zone.js:265 
onInvokeTask @ ng_zone.js:227 
ZoneDelegate.invokeTask @ zone.js:264 
Zone.runTask @ zone.js:154 
ZoneTask.invoke @ zone.js:335 
data.args.(anonymous function) @ zone.js:970 
+0

請爲這個問題提供一個解決方法,您可以使用[this one](http://embed.plnkr.co/w2FVfKlWP72pzXIsfsCU/)作爲模板。 –

回答

0

錯誤說什麼是錯的:

phone.component.ts:137 Uncaught TypeError: PhoneComponent_1.phones.set is not a function

所以問題不在combineLatest

您的phones屬性已設置(它不是null),但沒有set方法。 Map.set應該存在,所以它看起來像phones是不是你認爲它是(可能你無意中覆蓋它)。

class A { 
    static m: Map<number, {}> = new Map<number, {}>(); 
} 

A.m.set(1, {'a': 123}); 
A.m.set(2, {'a': 321}); 

console.log(A.m); 

上述作品中的例子,但看看在那裏你撥打Observable.combineLatest,因爲如果你看一下編譯JS,你會看到,你可以稱之爲Observable.combineLatest靜態屬性初始化之前:

var A = (function() { 
    function A() { 
    } 
    return A; 
}()); 
A.m = new Map(); 
A.m.set(1, { 'a': 123 }); 
A.m.set(2, { 'a': 321 }); 
console.log(A.m); 
+0

謝謝。你是對的。我確實看到了錯誤,但在一段時間後依然無法解決。另一位觀察員正在進入商店並引發問題。在評論之後,一切按預期運行。 –