refactor(form example): TSify
This commit is contained in:
parent
6c1cb089b5
commit
ed8364741b
|
@ -1,22 +1,22 @@
|
|||
import {bootstrap, NgIf, NgFor, EventEmitter} from 'angular2/angular2';
|
||||
import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms';
|
||||
import {bootstrap, NgIf, NgFor, EventEmitter, Component, View} from 'angular2/angular2';
|
||||
import {
|
||||
FormBuilder,
|
||||
Validators,
|
||||
formDirectives,
|
||||
ControlGroup,
|
||||
Control,
|
||||
ControlArray
|
||||
} from 'angular2/forms';
|
||||
|
||||
// TODO(radokirov): Once the application is transpiled by TS instead of Traceur,
|
||||
// add those imports back into 'angular2/angular2';
|
||||
import {Component, Directive} from 'angular2/src/core/annotations_impl/annotations';
|
||||
import {View} from 'angular2/src/core/annotations_impl/view';
|
||||
import {ObservableWrapper} from 'angular2/src/facade/async';
|
||||
import {print} from 'angular2/src/facade/lang';
|
||||
|
||||
// HeaderFields renders the bound header control group. It can used as follows:
|
||||
//
|
||||
// <survey-header [header]="header"></survey-header>
|
||||
//
|
||||
// This component is self-contained and can be tested in isolation.
|
||||
@Component({
|
||||
selector: 'survey-header',
|
||||
properties: {
|
||||
"header" : "header"
|
||||
}
|
||||
})
|
||||
@Component({selector: 'survey-header', properties: {"header": "header"}})
|
||||
@View({
|
||||
template: `
|
||||
<div [control-group]="header">
|
||||
|
@ -59,10 +59,7 @@ class HeaderFields {
|
|||
@Component({
|
||||
selector: 'survey-question',
|
||||
events: ['destroy'],
|
||||
properties: {
|
||||
"question" : "question",
|
||||
"index" : "index"
|
||||
}
|
||||
properties: {"question": "question", "index": "index"}
|
||||
})
|
||||
@View({
|
||||
template: `
|
||||
|
@ -108,24 +105,19 @@ class SurveyQuestion {
|
|||
index: number;
|
||||
destroy: EventEmitter;
|
||||
|
||||
constructor() {
|
||||
this.destroy = new EventEmitter();
|
||||
}
|
||||
constructor() { this.destroy = new EventEmitter(); }
|
||||
|
||||
deleteQuestion() {
|
||||
deleteQuestion(): void {
|
||||
// Invoking an injected event emitter will fire an event,
|
||||
// which in this case will result in calling `deleteQuestion(i)`
|
||||
this.destroy.next(null);
|
||||
ObservableWrapper.callNext(this.destroy, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// SurveyBuilder is a form that allows you to create a survey.
|
||||
@Component({
|
||||
selector: 'survey-builder-app',
|
||||
appInjector: [FormBuilder]
|
||||
})
|
||||
@Component({selector: 'survey-builder-app', appInjector: [FormBuilder]})
|
||||
@View({
|
||||
template: `
|
||||
<h1>Create New Survey</h1>
|
||||
|
@ -148,31 +140,29 @@ class SurveyQuestion {
|
|||
})
|
||||
class SurveyBuilder {
|
||||
form: ControlGroup;
|
||||
builder:FormBuilder;
|
||||
|
||||
constructor(b:FormBuilder) {
|
||||
this.builder = b;
|
||||
this.form = b.group({
|
||||
"header" : b.group({
|
||||
constructor(public builder: FormBuilder) {
|
||||
this.form = builder.group({
|
||||
"header": builder.group({
|
||||
"title": ["", Validators.required],
|
||||
"description": ["", Validators.required],
|
||||
"date": ""
|
||||
}),
|
||||
"questions": b.array([])
|
||||
"questions": builder.array([])
|
||||
});
|
||||
}
|
||||
|
||||
addQuestion() {
|
||||
var newQuestion = this.builder.group({
|
||||
addQuestion(): void {
|
||||
var newQuestion: ControlGroup = this.builder.group(
|
||||
{
|
||||
"type": ["", Validators.required],
|
||||
"questionText": ["", Validators.required],
|
||||
"responseLength": [100, Validators.required]
|
||||
}, {
|
||||
},
|
||||
{
|
||||
// Optional controls can be dynamically added or removed from the form.
|
||||
// Here, the responseLength field is optional and not included by default.
|
||||
"optionals": {
|
||||
"responseLength": false
|
||||
}
|
||||
"optionals": {"responseLength": false}
|
||||
});
|
||||
|
||||
// Every Control has an observable of value changes. You can subscribe to this observable
|
||||
|
@ -181,20 +171,25 @@ class SurveyBuilder {
|
|||
// complex form interactions in a declarative fashion.
|
||||
//
|
||||
// We are disabling the responseLength control when the question type is checkbox.
|
||||
newQuestion.controls.type.valueChanges.observer({
|
||||
next: (v) => v == 'text' || v == 'textarea' ? newQuestion.include('responseLength') : newQuestion.exclude('responseLength')
|
||||
});
|
||||
var typeCtrl: Control = newQuestion.controls['type'];
|
||||
|
||||
this.form.controls.questions.push(newQuestion);
|
||||
ObservableWrapper.subscribe(typeCtrl.valueChanges,
|
||||
(v) => v == 'text' || v == 'textarea' ?
|
||||
newQuestion.include('responseLength') :
|
||||
newQuestion.exclude('responseLength'));
|
||||
|
||||
(<ControlArray>this.form.controls['questions']).push(newQuestion);
|
||||
}
|
||||
|
||||
destroyQuestion(index:number) {
|
||||
this.form.controls.questions.removeAt(index);
|
||||
destroyQuestion(index: number): void {
|
||||
(<ControlArray>this.form.controls['questions']).removeAt(index);
|
||||
}
|
||||
|
||||
submitForm() {
|
||||
console.log("Submitting a form")
|
||||
console.log("value", this.form.value, "valid", this.form.valid, "errors", this.form.errors);
|
||||
submitForm(): void {
|
||||
print('Submitting a form');
|
||||
print(`"value: ${this.form.value}`);
|
||||
print(` valid: $ { this.form.valid } `);
|
||||
print(` errors: $ { this.form.errors }`);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue