2017-06-06 111 views
0

有同样的问题,很多人在计算器上我没明白什么是“外部角区”服务后?角度2:什么使服务成为“外部”角区域?

我已经检查解决此问题的所有存在的问题,而且它也正是为什么我needer问这一个:

具有默认更改的任何组件中的代码示例DetectionStrategy: (考虑THIS.VALUE在视图中引用)

this.myService.method().subscribe(e => { 
    this.value = e; 
    }); 

是给定的服务 “外角区”,认为刷新,而另一方面,如果这是“外角区域”,视图不是刷新,除非我们调用ChangeDetectorRef.detectChanges()。

所以,问题是:如何知道的情况,如果一个服务是内部或外部的“角区”?

回答

2

你想要的代码是NgZone.isInAngularZone()。这会告诉你它是否在那里执行。

来源:敲我的头靠在墙上写这之前读取角文档的时间。

此外,你可以注入NgZone到你的服务,并尝试使用this.ngZone.run(() => yourSubscriberCallback())这应该有所帮助,虽然我有非常复杂的结果尝试这一点。

编辑:好吧,我设法让我的东西工作,让我们看看它是否可以帮助你。

在我的情况下,我正在使用第三方库,包括一个监听器的变化。我正在使用RXJS BehaviorSubject通过服务将这些更改传播到各个组件,但这些更改没有被拾取。

事实证明,这是因为我在侦听器中使用的方法在AngularZone之外执行。

起初,我这样做:

export class Service { 

    public BehaviorSubject<Thing> thingSubject = new BehaviorSubject<Thing>(new Thing()); 

    constructor(private ngZone:NgZone) { 
    thirdPartyLibrary.listen(ngZone.run(() => myCallback.bind(_this))); 
    } 

    ... 

} 

而且myCallback在做:

myCallback(thing) { 
    this.thingSubject.next(thing); 
} 

原来,这似乎并没有在正确的角度带内执行。我改变了我的代码,这虽然和它的工作:

export class Service { 

    public BehaviorSubject<Thing> thingSubject = new BehaviorSubject<Thing>(new Thing()); 

    constructor(private ngZone:NgZone) { 
    thirdPartyLibrary.listen(myCallback.bind(_this)); 
    } 

    myCallback(thing) { 
    this.ngZone.run(() => this.thingSubject.next(thing)); 
    } 

} 

这样做,我的所有订户收到的角度带内的消息,并引发预期的更新之后。

0

据我知道,那是不可能的检查是否东西运行“内部”和“外部”的角区。如果您使用zone.runOutsideAngular它会在您的区域外运行。第二个出现在我的脑海里:你为什么想知道?

+0

不一定在运行时。我想知道什么样的服务能够自动更新视图以及哪些服务不是。 – Sid

+0

everthing你将运行在'zone.runOutsideAngular'不会更新视图。 –

0

它看起来像我找到了我的回应我自己,但我希望这将是为其他人的帮助:

“外部角区”服务是没有角上下文中实例化一个类。 使用静态存取许多图书馆都有待于在这种情况下,这里有一个例子:

http://techqa.info/programming/question/34592857/view-is-not-updated-on-change-in-angular2

我的运气,它是使用相同的库。如此外部资源中所述,设法实例化外部库对象将解决视图刷新问题,并让此服务成为“内部角区域”。