Erw*_*win 204 angular2-changedetection angular
在AngularJS中,您可以使用$watch函数来指定观察者观察范围变量的变化$scope.在Angular中观察变量(例如,组件变量)的等价物是什么?
Mar*_*cok 263
在Angular 2中,更改检测是自动的...... $scope.$watch()和$scope.$digest()RIP
遗憾的是,开发指南的"更改检测"部分尚未编写(" 架构概述"页面底部附近有一个占位符,位于"其他内容"部分).
以下是我对变更检测如何工作的理解:
setTimeout()在我们的组件内使用而不是像$timeout...因为setTimeout()猴子修补.ChangeDetectorRef.)当Angular创建组件时,会创建这些更改检测器.它们会跟踪所有绑定的状态,以便进行脏检查.从某种意义上说,这些类似于$watches()Angular 1为{{}}模板绑定设置的自动化.onPush在任何组件上使用更改检测策略),树中的每个组件都会从顶部按深度优先顺序检查一次(TTL = 1).(好吧,如果您处于开发模式,更改检测会运行两次(TTL = 2).有关此内容,请参阅ApplicationRef.tick().)它使用这些更改检测器对象对所有绑定执行脏检查.
其他参考资料了解更多:
onPush.tos*_*skv 89
此行为现在是组件生命周期的一部分.
组件可以在OnChanges接口中实现ngOnChanges方法以访问输入更改.
例:
import {Component, Input, OnChanges} from 'angular2/core';
@Component({
selector: 'hero-comp',
templateUrl: 'app/components/hero-comp/hero-comp.html',
styleUrls: ['app/components/hero-comp/hero-comp.css'],
providers: [],
directives: [],
pipes: [],
inputs:['hero', 'real']
})
export class HeroComp implements OnChanges{
@Input() hero:Hero;
@Input() real:string;
constructor() {
}
ngOnChanges(changes) {
console.log(changes);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 65
如果除了自动双向绑定之外,您希望在值更改时调用函数,则可以将双向绑定快捷方式语法分解为更详细的版本.
<input [(ngModel)]="yourVar"></input>
是简写
<input [ngModel]="yourVar" (ngModelChange)="yourVar=$event"></input>
(参见http://victorsavkin.com/post/119943127151/angular-2-template-syntax)
你可以这样做:
<input [(ngModel)]="yourVar" (ngModelChange)="changedExtraHandler($event)"></input>
jmv*_*dad 16
您可以使用getter function或get accessor充当角度2的手表.
在这里看演示.
import {Component} from 'angular2/core';
@Component({
// Declare the tag name in index.html to where the component attaches
selector: 'hello-world',
// Location of the template for this component
template: `
<button (click)="OnPushArray1()">Push 1</button>
<div>
I'm array 1 {{ array1 | json }}
</div>
<button (click)="OnPushArray2()">Push 2</button>
<div>
I'm array 2 {{ array2 | json }}
</div>
I'm concatenated {{ concatenatedArray | json }}
<div>
I'm length of two arrays {{ arrayLength | json }}
</div>`
})
export class HelloWorld {
array1: any[] = [];
array2: any[] = [];
get concatenatedArray(): any[] {
return this.array1.concat(this.array2);
}
get arrayLength(): number {
return this.concatenatedArray.length;
}
OnPushArray1() {
this.array1.push(this.array1.length);
}
OnPushArray2() {
this.array2.push(this.array2.length);
}
}
Run Code Online (Sandbox Code Playgroud)
sel*_*ect 11
这是另一种使用模型的getter和setter函数的方法.
@Component({
selector: 'input-language',
template: `
…
<input
type="text"
placeholder="Language"
[(ngModel)]="query"
/>
`,
})
export class InputLanguageComponent {
set query(value) {
this._query = value;
console.log('query set to :', value)
}
get query() {
return this._query;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想使它成双向绑定,你可以使用[(yourVar)],但你必须实现yourVarChange事件并在每次变量变化时调用它.
像这样追踪英雄变化的东西
@Output() heroChange = new EventEmitter();
Run Code Online (Sandbox Code Playgroud)
然后当你的英雄变了,打电话 this.heroChange.emit(this.hero);
在[(hero)]结合将完成剩下的你
看这里的例子:
http://plnkr.co/edit/efOGIJ0POh1XQeRZctSx?p=preview
这并没有直接回答这个问题,但我在不同的场合遇到过这个 Stack Overflow 问题,以解决我会在 angularJs 中使用 $watch 的问题。我最终使用了当前答案中描述的另一种方法,并希望分享它,以防有人发现它有用。
我用来实现类似目标的技术$watch是在 Angular 服务中使用BehaviorSubject(更多关于这里的主题),并让我的组件订阅它以获取(观察)更改。这类似于$watchangularJs 中的 a,但需要更多的设置和理解。
在我的组件中:
export class HelloComponent {
name: string;
// inject our service, which holds the object we want to watch.
constructor(private helloService: HelloService){
// Here I am "watching" for changes by subscribing
this.helloService.getGreeting().subscribe( greeting => {
this.name = greeting.value;
});
}
}
Run Code Online (Sandbox Code Playgroud)
在我的服务
export class HelloService {
private helloSubject = new BehaviorSubject<{value: string}>({value: 'hello'});
constructor(){}
// similar to using $watch, in order to get updates of our object
getGreeting(): Observable<{value:string}> {
return this.helloSubject;
}
// Each time this method is called, each subscriber will receive the updated greeting.
setGreeting(greeting: string) {
this.helloSubject.next({value: greeting});
}
}
Run Code Online (Sandbox Code Playgroud)
这是Stackblitz上的演示
| 归档时间: |
|
| 查看次数: |
138078 次 |
| 最近记录: |