2016-12-31 59 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

谢谢。你是对的。我确实看到了错误,但在一段时间后依然无法解决。另一位观察员正在进入商店并引发问题。在评论之后,一切按预期运行。 –