{"id":147,"date":"2017-10-22T22:15:57","date_gmt":"2017-10-22T22:15:57","guid":{"rendered":"http:\/\/dart.honobono-life.info\/?p=147"},"modified":"2017-10-22T22:15:57","modified_gmt":"2017-10-22T22:15:57","slug":"angulardart-v4-custom-formformbuilder","status":"publish","type":"post","link":"http:\/\/dart.honobono-life.info\/?p=147","title":{"rendered":"AngularDart v4 custom form,FormBuilder"},"content":{"rendered":"AngularDart v4 Sample Code,Demo<br \/>\r\n<!--more-->\r\n<ul>\r\n<li>AngularDart : 4.0.0<\/li>\r\n<li>Dart : 1.24.1<\/li>\r\n<\/ul>\r\n<div role=\"tabpanel\">\r\n  <ul class=\"nav nav-tabs\">\r\n    <li class=\"active\"><a href=\"#demo1\" data-toggle=\"tab\">demo<\/a><\/li>\r\n    <li><a href=\"#html1\" data-toggle=\"tab\">markup<\/a><\/li>\r\n    <li><a href=\"#script1\" data-toggle=\"tab\">dart<\/a><\/li>\r\n  <\/ul>\r\n  <div class=\"tab-content\">\r\n    <div class=\"tab-pane active\" id=\"demo1\">\r\n\r\n<my-app>Loading&#8230;<\/my-app>\r\n\r\n    <\/div>\r\n    <div class=\"tab-pane\" id=\"html1\">\r\n\r\n<pre>\r\n(html)\r\n&lt;head>\r\n.....\r\n  &lt;script defer src=\"main.dart\" type=\"application\/dart\">&lt;\/script>\r\n  &lt;script defer src=\"packages\/browser\/dart.js\">&lt;\/script>\r\n&lt;\/head>\r\n&lt;body>\r\n  &lt;my-app>Loading...&lt;\/my-app>\r\n&lt;\/body>\r\n\r\n(pubspec.yaml)\r\n.....\r\nenvironment:\r\n  sdk: '>=1.24.0 <2.0.0'\r\ndependencies:\r\n  angular: ^4.0.0\r\n  angular_forms: ^1.0.0\r\n  angular_router: ^1.0.2\r\n  http: ^0.11.0\r\n  stream_transform: ^0.0.6\r\n\r\ndev_dependencies:\r\n  angular_test: ^1.0.0\r\n  browser: ^0.10.0\r\n  dart_to_js_script_rewriter: ^1.0.1\r\n  mockito: ^2.0.2\r\n  test: ^0.12.21\r\n\r\ntransformers:\r\n- angular:\r\n    entry_points:\r\n    - web\/main.dart\r\n    - test\/**_test.dart\r\n- test\/pub_serve:\r\n    $include: test\/**_test.dart\r\n- dart_to_js_script_rewriter\r\n<\/pre>\r\n    <\/div>\r\n\r\n    <div class=\"tab-pane\" id=\"script1\">\r\n<pre>\r\nimport 'package:angular\/angular.dart';\r\nimport 'package:angular_forms\/angular_forms.dart';\r\n\r\nzipValidator(AbstractControl zip) {\r\n  var reg = new RegExp(r'^\\d{7}$');\r\n  var valid = reg.hasMatch(zip.value);\r\n  if(zip.value == \"\" || valid) {\r\n    return null;\r\n  } else {\r\n    return {\"invalidZip\":true};\r\n  }\r\n}\r\n\r\nclass User {\r\n  String name;\r\n  String email;\r\n  String zip;\r\n\r\n  User(this.name,this.email,this.zip);\r\n}\r\n\r\n@Component(\r\n  selector: 'my-app',\r\n    styles: const ['''\r\n    form.ng-invalid.ng-dirty { background-color: lightpink; }\r\n    form.ng-valid.ng-dirty { background-color: lightgreen; }\r\n    .ng-valid {\r\n      border-left: 5px solid lightgreen;\r\n    }\r\n    .ng-invalid {\r\n      border-left: 5px solid lightpink;\r\n    }\r\n    form { padding: 10px;}\r\n  '''],\r\n  template: '''\r\n&lt;form (ngSubmit)=\"onSubmit(myForm.value)\" [ngFormModel]=\"myForm\" novalidate>\r\n&lt;div class=\"well\">\r\n  &lt;div class=\"form-group\">\r\n    &lt;label>Member ID&lt;\/label>\r\n    &lt;input type=\"text\" class=\"form-control\" ngControl=\"user_name\" \/>\r\n    &lt;div *ngIf=\"myForm.controls['user_name'].dirty &&\r\n                !myForm.controls['user_name'].valid\">\r\n      &lt;span class=\"text-danger\"\r\n        [hidden]=\"!myForm.controls['user_name'].errors.containsKey('required')\">\r\n        This is a required field&lt;\/span>\r\n      &lt;span class=\"text-danger\"\r\n        [hidden]=\"!myForm.controls['user_name'].errors.containsKey('minlength')\">\r\n        Minimum length required is 5&lt;\/span>\r\n      &lt;span class=\"text-danger\"\r\n        [hidden]=\"!myForm.controls['user_name'].errors.containsKey('maxlength')\">\r\n        Max length required is 10&lt;\/span>\r\n      &lt;span class=\"text-danger\"\r\n        [hidden]=\"!myForm.controls['user_name'].errors.containsKey('pattern')\">\r\n        Only uppercase letter,digit&lt;\/span>\r\n    &lt;\/div>\r\n  &lt;\/div>\r\n  &lt;div class=\"form-group\">\r\n    &lt;label>Email&lt;\/label>\r\n    &lt;input type=\"email\" class=\"form-control\" ngControl=\"user_email\" \/>\r\n    &lt;div *ngIf=\"myForm.controls['user_email'].dirty && \r\n                !myForm.controls['user_email'].valid\">\r\n      &lt;span class=\"text-danger\"\r\n        [hidden]=\"!myForm.controls['user_email'].errors.containsKey('required')\">\r\n        This is a required field&lt;\/span>\r\n      &lt;span class=\"text-danger\"\r\n        [hidden]=\"!myForm.controls['user_email'].errors.containsKey('pattern')\">\r\n        Enter a valid email address&lt;\/span>\r\n    &lt;\/div>\r\n  &lt;\/div>\r\n  &lt;div class=\"form-group\">\r\n    &lt;label>Zip code(7-digit number,excluding hyphen)&lt;\/label>\r\n    &lt;input type=\"text\" class=\"form-control\" ngControl=\"user_zip\" \/>\r\n    &lt;div *ngIf=\"myForm.controls['user_zip'].dirty && \r\n                !myForm.controls['user_zip'].valid\">\r\n      &lt;span class=\"text-danger\"\r\n        [hidden]=\"!myForm.controls['user_zip'].errors.containsKey('invalidZip')\">\r\n        7-digit number,excluding hyphen&lt;\/span>\r\n    &lt;\/div>\r\n  &lt;\/div>\r\n  &lt;div class=\"text-center\">\r\n    &lt;button type=\"submit\" class=\"btn btn-primary\"\r\n        [disabled]=\"!myForm.valid\">Submit&lt;\/button>\r\n  &lt;\/div>\r\n&lt;\/div>\r\n&lt;\/form>\r\n\r\n&lt;div class=\"well\" *ngIf=\"submitted\">\r\n  &lt;strong>You submitted the following&lt;\/strong>&lt;br \/>\r\n  &lt;span>{{ master | json }}&lt;\/span>\r\n&lt;\/div>\r\n    ''',\r\n  directives: const [CORE_DIRECTIVES, formDirectives],\r\n  pipes: const [COMMON_PIPES],\r\n  viewProviders: const [FORM_BINDINGS]\r\n)\r\nclass AppComponent {\r\n  var master;\r\n  bool submitted = false;\r\n  ControlGroup myForm;\r\n\r\n  AppComponent() {\r\n    final fb = new FormBuilder();\r\n    myForm = fb.group({\r\n      \"user_name\": ['A1234', Validators.compose([\r\n         Validators.required,\r\n         Validators.minLength(5),\r\n         Validators.maxLength(10),\r\n         Validators.pattern('[A-Z0-9]+')])],\r\n      \"user_email\": ['test@example.com',Validators.compose([\r\n         Validators.required,\r\n         Validators.pattern('[A-Za-z0-9.\\-]+@[A-Za-z0-9\\-]+[.][A-Za-z0-9.\\-]+')])],\r\n      \"user_zip\": ['1234567', Validators.compose([zipValidator])]\r\n    });\r\n  }\r\n  void onSubmit(user){\r\n    master = user;\r\n    submitted = true;\r\n  }\r\n}\r\n\r\nvoid main() {\r\n  bootstrap(AppComponent);\r\n}\r\n<\/pre>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n<script type=\"text\/javascript\"  src='http:\/\/dart.honobono-life.info\/wp-content\/themes\/ang\/ngdart4\/cusform.dart.js'><\/script>","protected":false},"excerpt":{"rendered":"<p>AngularDart v4 Sample Code,Demo<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/posts\/147"}],"collection":[{"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=147"}],"version-history":[{"count":1,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/posts\/147\/revisions"}],"predecessor-version":[{"id":148,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/posts\/147\/revisions\/148"}],"wp:attachment":[{"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=147"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}