Umu*_*zer 12 firebase firebase-realtime-database angularfire2 angular
我正在尝试使用AngularFire 2(2.0.0-beta.2)将输入元素三路绑定到Angular.js 2(2.0.0-rc.4)中的firebase数据库.
我有一个非常简单的HTML:
<form (ngSubmit)="onSubmit()" #commentForm="ngForm">
<input [(ngModel)]="model.author" type="input" name="author" required>
</form>
Run Code Online (Sandbox Code Playgroud)
在我的组件中,为了保存和检索此输入的内容到firebase,我有一个这样的实现:
export class CommentFormComponent implements OnInit, AfterViewInit {
@ViewChild("commentForm") form;
// http://stackoverflow.com/questions/34615425/how-to-watch-for-form-changes-in-angular-2
firebaseInitComplete = false;
model: Comment = new Comment("", "");
firebaseForm: FirebaseObjectObservable<Comment>;
constructor(private af: AngularFire) { }
ngAfterViewInit() {
this.form.control.valueChanges
.subscribe(values => {
// If we haven't get the initial value from firebase yet,
// values will be empty strings. And we don't want to overwrite
// real firebase value with empty string on page load
if (!this.firebaseInitComplete) { return; }
// If this is a change after page load (getting initial firebase value) update it on firebase to enable 3-way binding
this.firebaseForm.update(values);
});
}
ngOnInit() {
this.firebaseForm = this.af.database.object("/currentComment");
// Listen to changes on server
this.firebaseForm.subscribe(data => {
this.firebaseInitComplete = true; // Mark first data retrieved from server
this.model = data;
});
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作,当用户实时输入内容时,我能够读取firebase的初始firebase值和更新值.
但是有一个手动逻辑来检查this.firebaseInitComplete
和添加ngAfterViewInit
以监听更改感觉有点不对,我只是在破解它工作.
是否有更好的三向绑定实现,组件内的逻辑更少?
七个月后,我有一个答案..扩展ngModel语法..
<input [ngModel]='(model|async)?.author' (ngModelChange)="model.update({author: $event})">
Run Code Online (Sandbox Code Playgroud)
[]块是一个getter,而()块是一个setter.由于模型的getter实际上是展开FirebaseObjectObservable,因此必须使用FirebaseObjectObservable的绑定来设置它.
归档时间: |
|
查看次数: |
2475 次 |
最近记录: |