2017-04-17 84 views
0

这不是我不想更新视图,我只是不明白为什么它会在我不期望它时更新它(因为对象是在NG外部更新的)。Angular 2更新查看它什么时候不应该?

好的。

我有这个简单的代码:

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
    <input type='button' value="Fill more" (click)="fillMore()"/> 
    <ul> 
     <li *ngFor="let item of Items "> 
     {{item}} 
     </li> 
    </ul> 
    </div> 
    `, 
}) 
export class App { 

    Items:Array<number> = new Array<number>(); 

    constructor(private mySignalRService:MySignalRService) 
    { 
    this.Items.push(...[1,2,3]); //initial values 
    } 

    fillMore() 
    { 
    this.mySignalRService.go(this.Items); 
    } 
} 

正如你看到的,我也注入服务:

@Injectable() 
export class MySignalRService 
{ 
    makeDummyDb:Promise<Array<number>>() 
    { 
     return new Promise((v,x)=> { 
     setTimeout(function(){v([100,200,300]);},800); 
     }) 
    } 

    go(arr : Array<number>) : number 
    { 
    this.makeDummyDb().then((newValues)=>arr.push(...newValues)) ; 
    return 5; //this method must return a number 
    } 
} 

现在 - 当我点击按钮(在“填写更多“按钮),我看到附加的项目,但是当我想起它,它不是因为更新因为我相信makeDummyDb:Promise是在角的区域外(我可能在这里是错误的)

问:

是不是阵列更新发生角的区域?我如何模拟一个真正的外部区域,以便代码无法工作? (用于测试)

Plnkr

+0

看看这个运行的东西zone.js之外 http://stackoverflow.com/questions/43121400/run-ngrx-effect-outside-of -angulars-zone-to-prevent-timeout-in-massractor – intekhab

回答

2

如果你的观念是的setTimeout或承诺将“外”的区域,这不是它是如何工作的; Angular 2劫持了setTimeout和setInterval(并且据我所知,使用TypeScript时,querySelector返回的是IE元素而不是HTMLElement,它强制类型转换访问类似“style”的东西,尽管这不会与区域有什么关系,只是指出在TS/Angular2中,有些东西可能会有点不同)。每当超时启动时,都会发生更改检测。据我所知,这就是为什么你的价值已经设定好了,我看到的一切都在这个区域内。你必须采取一些明确的措施来避免这种情况。

周围工作的小例子:

ngZone.runOutsideAngular(() => 
    Observable.interval(2500).subscribe(() => { 
     // async operation 
}); 
+0

好的,我怎么能通过简单的方法来测试一个“外部”区域? –

+0

发布解决方案的示例。你可以看看(有很多关于这个的文档,但是可以将它们放在一起很棘手)https://christianliebel.com/2016/11/angular-2-protractor-timeout-heres-fix/ –

相关问题