{"action":"created","comment":{"url":"https://api.github.com/repos/angular/angular.io/pulls/comments/46335317","id":46335317,"diff_hunk":"@@ -0,0 +1,662 @@\n+include ../../../../_includes/_util-fns\n+\n+<!-- http://plnkr.co/edit/wg154K -->\n+:marked\n+  We’ve all used a form to log in, submit a help request, place an order, book a flight,\n+  schedule a meeting, and perform countless other data entry tasks.\n+  Forms are the mainstay of business applications.\n+\n+  Any seasoned web developer can slap together an HTML form with all the right tags.\n+  It's more challenging to create a cohesive data entry experience that guides the\n+  user efficiently and effectively through the workflow behind the form.\n+\n+  *That* takes design skills that are, to be frank, well out of scope for this guide.\n+\n+  It also takes framework support for\n+  **two-way data binding, change tracking, validation, and error handling**\n+  ... which we shall cover in this guide on Angular forms.\n+\n+  We will build a simple form from scratch, one step at a time. Along the way we'll learn:\n+\n+  - How to build an Angular form with a component and template\n+\n+  - The `ng-model` two-way data binding syntax for reading and writing values to input controls\n+\n+  - The `ng-control` directive to track the change state and validity of form controls\n+\n+  - The special CSS classes that `ng-control` adds to form controls and how to use them to provide strong visual feedback\n+\n+  - How to display validation errors to users and enable/disable form controls\n+\n+  - How to share information across controls with template local variables\n+\n+.l-main-section\n+:marked\n+  ## Template-driven forms\n+\n+  Many of us will build forms by writing templates in the Angular\n+  template syntax\n+  <!-- link to ./template-syntax.html -->\n+  with the form-specific directives and techniques described in this guide.\n+\n+.l-sub-section\n+  :marked\n+    That's not the only way to create a form but it's the way we'll cover in this guide.\n+:marked\n+  We can build almost any form we need with an Angular template—login forms, contact forms, pretty much any business form.\n+  We can lay out the controls creatively, bind them to data, specify validation rules and display validation errors,\n+  conditionally enable or disable specific controls, trigger built-in visual feedback, and much more.\n+\n+  It will be pretty easy because Angular handles many of the repetitive, boilerplate tasks we'd\n+  otherwise wrestle with ourselves.\n+\n+  We'll discuss and learn to build the following template-driven form:\n+\n+figure.image-display\n+  img(src=\"/resources/images/devguide/forms/hf-1.png\" alt=\"Clean Form\")\n+\n+:marked\n+  Here at the *Hero Employment Agency* we use this form to maintain personal information about the\n+  heroes in our stable. Every hero needs a job. It's our company mission to match the right hero with the right crisis!\n+\n+  Two of the three fields on this form are required. Required fields have a green bar on the left to make them easy to spot.\n+\n+  If we delete the hero name, the form displays a validation error in an attention-grabbing style:\n+\n+figure.image-display\n+  img(src=\"/resources/images/devguide/forms/hf-2.png\" alt=\"Invalid, Name Required\")\n+\n+:marked\n+  Note that the submit button is disabled, and the \"required\" bar to the left of the input control changed from green to red.\n+\n+.l-sub-section\n+  p We'll customize the colors and location of the \"required\" bar with standard CSS.\n+\n+:marked\n+  We'll build this form in small steps:\n+\n+  1. Create the `Hero` model class.\n+  1. Create the component that controls the form.\n+  1. Create a template with the initial form layout.\n+  1. Add the **ng-model** directive to each form input control.\n+  1. Add the **ng-control** directive to each form input control.\n+  1. Add custom CSS to provide visual feedback.\n+  1. Show and hide validation error messages.\n+  1. Handle form submission with **ng-submit**.\n+  1. Change the form's display after submission.\n+\n+:marked\n+  ## Setup\n+  Create a new project folder (`angular2_forms`) and create 3 files:\n+  `pubspec.yaml`, `web/index.html`, and `web/main.dart`.\n+  (These files should be familiar from the\n+  [QuickStart](../quickstart.html).) Put these contents in the files:\n+\n++makeTabs('forms/dart/angular2_forms-1-SETUP/pubspec.yaml, forms/dart/angular2_forms-1-SETUP/web/index.html, forms/dart/angular2_forms-1-SETUP/web/main.dart', null, 'pubspec.yaml, web/index.html, web/main.dart')\n+\n+:marked\n+  So that the code can run,\n+  let's create a stub for the `<hero-form>` component.\n+\n+  Create a new directory called `lib`.\n+  In it, put a file called `hero_form_component.dart`\n+  with the following code:\n+\n++makeExample('forms/dart/angular2_forms-1-SETUP/lib/hero_form_component.dart', null, 'lib/hero_form_component.dart')\n+\n+:marked\n+  The app should now run, but it won't do anything interesting.\n+  Let's add some data.\n+\n+\n+  ## Create the Hero model class\n+\n+  As users enter form data, we'll capture their changes and update an instance of a model.\n+  We can't lay out the form until we know what the model looks like.\n+\n+  A model can be as simple as a \"property bag\" that holds facts about a thing of application importance.\n+  That describes well our `Hero` class with its three required fields (`id`, `name`, `power`)\n+  and one optional field (`alterEgo`).\n+\n+  In the `lib` directory, add a file called `hero.dart`\n+  with the following code:\n+\n++makeExample('forms/dart/angular2_forms-2-COMPONENT/lib/hero.dart', 'all', 'lib/hero.dart')\n+\n+:marked\n+  It's an anemic model with few requirements and no behavior. Perfect for our demo.\n+\n+  Here's an example of creating and using a Hero object:\n+\n++makeExample('forms/dart/angular2_forms-2-COMPONENT/lib/hero.dart', 'newhero')(format=\".\")\n+\n+:marked\n+  The `alterEgo` is optional, so the constructor lets us omit it: note the\n+  `[]` in `[this.alterEgo]`.\n+\n+\n+.l-main-section\n+:marked\n+  ## Create a form component\n+\n+  An Angular form has two parts: an HTML-based template and a code-based component to handle data and user interactions.\n+\n+  We begin with the component because it states, in brief, what the Hero editor can do.\n+\n+  Edit `hero_form_component.dart`, replacing all of its contents\n+  with the following code:\n+\n++makeExample('forms/dart/angular2_forms-2-COMPONENT/lib/hero_form_component.dart', null, 'lib/hero_form_component.dart')\n+\n+:marked\n+  There’s nothing special about this component, nothing to distinguish it from any component we've written before,\n+  nothing form-specific about it ... except, perhaps, the tell-tale `FORM_DIRECTIVES` import.\n+\n+  Understanding this component requires only the Angular 2 concepts covered in previous guides.\n+\n+  1. The code imports a standard set of symbols from the Angular library.\n+     Importing `FORM_DIRECTIVES` is unsurprising, given that we'll be writing a form.\n+\n+  1. The `@Component` selector value of \"hero-form\" means we can drop this form in a parent template with a `<hero-form>` tag.\n+\n+  1. The `templateUrl` property points to a separate file for template HTML called `hero_form_component.html`.\n+\n+  1. We defined dummy data for `model` and `powers`, as befits a demo.\n+  Down the road, we can inject a data service to get and save real data\n+  or perhaps expose these properties as inputs and outputs\n+  <!--TODO: link to (./template-syntax.html#inputs-outputs) --> for binding to a\n+  parent component. None of this concerns us now, and these future changes won't affect our form.\n+\n+  1. We threw in a `diagnostic` property to return a\n+  string describing our model.\n+  It'll help us see what we're doing during our development; we've left ourselves a cleanup note to discard it later.\n+\n+  Why isn't the template inline in the component file?\n+\n+  Inline templates can be nice when they are short,\n+  but most form templates aren't short. Dart files generally aren't the best place to\n+  write (or read) large stretches of HTML, and few editors are much help with files that have a mix of HTML and code.\n+  It's also nice to have short files with a clear and obvious purpose.\n+\n+  We made a good choice to put the HTML template elsewhere. Let's write it.\n+\n+  <!-- NOTE: I deleted the Dart equivalent of \"Revise the app.ts\"\n+  because we started with example-specific index.html & main.dart\n+  files. -->\n+\n+\n+\n+.l-main-section\n+:marked\n+  ## Create an initial HTML form template\n+\n+  Create a new file under `lib` called `hero_form_component.html`,\n+  and put the following template code in it:\n+\n++makeExample('forms/dart/angular2_forms-2-COMPONENT/lib/hero_form_component.html', null, 'lib/hero_form_component.html')\n+\n+:marked\n+  That is plain old HTML 5. We're presenting two of the `Hero` fields, `name` and `alterEgo`, and\n+  opening them up for user input in input boxes.\n+\n+  The Name `<input>` control has the HTML5 `required` attribute;\n+  the Alter Ego `<input>` control does not because `alterEgo` is optional.\n+\n+  We've got a Submit button at the bottom with some classes on it.\n+\n+  **We are not using Angular yet**. There are no bindings. No extra directives. Just layout.\n+\n+\n+  The `container`,`form-group`, `form-control`, and `btn` classes are [Bootstrap](http://getbootstrap.com/) CSS. Purely cosmetic.\n+  We're using Bootstrap to gussy up our form.\n+  Hey, what's a form without a little style!\n+\n+.callout.is-important\n+  header Angular forms do not require a style library\n+  :marked\n+    Angular makes no use of the `container`, `form-group`, `form-control`, and `btn` classes or\n+    the styles of any external library. Angular apps can use any CSS library\n+    ... or none at all.\n+\n+:marked\n+  Let's add the stylesheet.\n+\n+  1. Download the Bootstrap stylesheet from\n+  https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css,\n+  and put it in the `web` directory.\n+\n+  2. Edit `web/index.html`, adding a link to `bootstrap.min.css`:\n+\n+- var stylePattern = { otl: /(&lt;link rel.*$)/gm };\n++makeExample('forms/dart/angular2_forms-2-COMPONENT/web/index.html', 'css', 'web/index.html', stylePattern)(format=\"linenums:4\")\n+\n+  [PENDING: runnable now? Remind about pub get? remind them to look in the browser console]\n+\n+\n+.l-main-section\n+:marked\n+  ## Add powers with ***ng-for**\n+  Our hero must choose one super power from a fixed list of Agency-approved powers.\n+  We maintain that list internally (in `HeroFormComponent`).\n+\n+  We'll add a `select` to our\n+  form and bind the options to the `powers` list using `NgFor`,\n+  a technique used before in [Displaying Data](./displaying-data.html).\n+\n+  Add the following HTML *immediately below* the Alter Ego group.\n++makeExample('forms/dart/angular2_forms-3-BINDING/lib/hero_form_component.html', 'powers', 'lib/hero_form_component.html')(format=\"linenums:14\")\n+\n+:marked\n+  This code repeats the `<option>` tag for each power in the list of powers.\n+  The `#p` local template variable is a different power in each iteration;\n+  we display its name using the interpolation syntax with the double curly braces.\n+\n+\n+.l-main-section\n+:marked\n+  ## Two-way data binding with ***ng-model**\n+  Running the app right now would be disappointing.\n+\n+figure.image-display\n+  img(src=\"/resources/images/devguide/forms/hf-3.png\" alt=\"Early form with no binding\")\n+:marked\n+  The problem is that we aren't binding to the `Hero` yet.\n+  We know how to do that from earlier guides.\n+  [Displaying Data](./displaying-data.html) demonstrated\n+  showing data onscreen with a property binding.\n+  [User Input](./user-input.html) showed how to listen for DOM events with an\n+  event binding and how to extract values from components.\n+\n+  Now we need to display, listen, and extract at the same time.\n+\n+  We could use the techniques we already know, but\n+  instead we'll introduce something new: the `NgModel` directive, which\n+  makes binding the form to the model super easy.\n+\n+  Find the `<input>` tag for Name and update it like this:\n+\n++makeExample('forms/dart/angular2_forms-3-BINDING/lib/hero_form_component.html', 'ng-model-1', 'lib/hero_form_component.html')(format=\"linenums:6\")\n+\n+.l-sub-section\n+  :marked\n+    We added a diagnostic interpolation after the input tag\n+    so we can see what we're doing.\n+    We left ourselves a note to throw it way when we're done.\n+\n+:marked\n+  Focus on the binding syntax: `[(ng-model)]=\"...\"`.\n+\n+  If we ran the app right now and started typing in the Name input box,\n+  adding and deleting characters, we'd see them appearing and disappearing\n+  from the interpolated text.\n+  At some point it might look like this.\n+figure.image-display\n+  img(src=\"/resources/images/devguide/forms/ng-model-in-action.png\" alt=\"ng-model in action\")\n+:marked\n+  The diagnostic is evidence that values really are flowing from the input box to the model and\n+  back again. **That's two-way data binding!**\n+\n+  Let's add similar `[(ng-model)]` bindings to Alter Ego and Hero Power.\n+  We'll ditch the input box binding message\n+  and add a new binding at the top to the component's `diagnostic` property.\n+  Then we can confirm two-way data binding *to the entire Hero model*.\n+\n+  After revision, the core of the form should have three `[(ng-model)]` bindings that\n+  look much like this:\n+\n++makeExample('forms/dart/angular2_forms-4-DIAGNOSTIC/lib/hero_form_component.html', 'ng-model-2', 'lib/hero_form_component.html')(format=\"linenums:4\")\n+\n+:marked\n+  If we ran the app right now and changed all the values, it might look like this:\n+figure.image-display","path":"public/docs/dart/latest/guide/forms.jade","position":311,"original_position":311,"commit_id":"084e4a40a8fe581cccf613c06df5761fae5db63a","original_commit_id":"084e4a40a8fe581cccf613c06df5761fae5db63a","user":{"login":"kwalrath","id":2164483,"avatar_url":"https://avatars.githubusercontent.com/u/2164483?v=3","gravatar_id":"","url":"https://api.github.com/users/kwalrath","html_url":"https://github.com/kwalrath","followers_url":"https://api.github.com/users/kwalrath/followers","following_url":"https://api.github.com/users/kwalrath/following{/other_user}","gists_url":"https://api.github.com/users/kwalrath/gists{/gist_id}","starred_url":"https://api.github.com/users/kwalrath/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kwalrath/subscriptions","organizations_url":"https://api.github.com/users/kwalrath/orgs","repos_url":"https://api.github.com/users/kwalrath/repos","events_url":"https://api.github.com/users/kwalrath/events{/privacy}","received_events_url":"https://api.github.com/users/kwalrath/received_events","type":"User","site_admin":false},"body":"The toString() method that I added to Hero produces this output. It's a custom string. Overriding toString() is a really common thing to do in Dart. The alternative (which we originally did) was to add and call a toJson() method, which was fine but produced output that's less readable and less Dart-y. It didn't seem like JSON was important here—just easy to produce—so I used the string instead.","created_at":"2015-12-01T20:38:43Z","updated_at":"2015-12-01T20:38:43Z","html_url":"https://github.com/angular/angular.io/pull/409#discussion_r46335317","pull_request_url":"https://api.github.com/repos/angular/angular.io/pulls/409","_links":{"self":{"href":"https://api.github.com/repos/angular/angular.io/pulls/comments/46335317"},"html":{"href":"https://github.com/angular/angular.io/pull/409#discussion_r46335317"},"pull_request":{"href":"https://api.github.com/repos/angular/angular.io/pulls/409"}}},"pull_request":{"url":"https://api.github.com/repos/angular/angular.io/pulls/409","id":51854729,"html_url":"https://github.com/angular/angular.io/pull/409","diff_url":"https://github.com/angular/angular.io/pull/409.diff","patch_url":"https://github.com/angular/angular.io/pull/409.patch","issue_url":"https://api.github.com/repos/angular/angular.io/issues/409","number":409,"state":"open","locked":false,"title":"[WIP] Dart forms guide (with full examples)","user":{"login":"kwalrath","id":2164483,"avatar_url":"https://avatars.githubusercontent.com/u/2164483?v=3","gravatar_id":"","url":"https://api.github.com/users/kwalrath","html_url":"https://github.com/kwalrath","followers_url":"https://api.github.com/users/kwalrath/followers","following_url":"https://api.github.com/users/kwalrath/following{/other_user}","gists_url":"https://api.github.com/users/kwalrath/gists{/gist_id}","starred_url":"https://api.github.com/users/kwalrath/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kwalrath/subscriptions","organizations_url":"https://api.github.com/users/kwalrath/orgs","repos_url":"https://api.github.com/users/kwalrath/repos","events_url":"https://api.github.com/users/kwalrath/events{/privacy}","received_events_url":"https://api.github.com/users/kwalrath/received_events","type":"User","site_admin":false},"body":"I don't intend to merge this until next week, but do let me know if you find any problems. In particular, I'm wondering if my approach to the examples (including a copy of every single version) is OK. If not, it'll require some code contortions that'll result in a Frankenstein example that doesn't work correctly.\r\n\r\nTo see the text diffs from the TS version, go to https://github.com/kwalrath/angular.io/commit/084e4a40a8fe581cccf613c06df5761fae5db63a#diff-80199a70f2fd234f9b3fb0dade4031b0.","created_at":"2015-11-25T22:48:08Z","updated_at":"2015-12-01T20:38:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"71efb1eeeeb791bbe8d1716fe4c3b1178e88ed9e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/angular/angular.io/pulls/409/commits","review_comments_url":"https://api.github.com/repos/angular/angular.io/pulls/409/comments","review_comment_url":"https://api.github.com/repos/angular/angular.io/pulls/comments{/number}","comments_url":"https://api.github.com/repos/angular/angular.io/issues/409/comments","statuses_url":"https://api.github.com/repos/angular/angular.io/statuses/084e4a40a8fe581cccf613c06df5761fae5db63a","head":{"label":"kwalrath:forms","ref":"forms","sha":"084e4a40a8fe581cccf613c06df5761fae5db63a","user":{"login":"kwalrath","id":2164483,"avatar_url":"https://avatars.githubusercontent.com/u/2164483?v=3","gravatar_id":"","url":"https://api.github.com/users/kwalrath","html_url":"https://github.com/kwalrath","followers_url":"https://api.github.com/users/kwalrath/followers","following_url":"https://api.github.com/users/kwalrath/following{/other_user}","gists_url":"https://api.github.com/users/kwalrath/gists{/gist_id}","starred_url":"https://api.github.com/users/kwalrath/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kwalrath/subscriptions","organizations_url":"https://api.github.com/users/kwalrath/orgs","repos_url":"https://api.github.com/users/kwalrath/repos","events_url":"https://api.github.com/users/kwalrath/events{/privacy}","received_events_url":"https://api.github.com/users/kwalrath/received_events","type":"User","site_admin":false},"repo":{"id":46308918,"name":"angular.io","full_name":"kwalrath/angular.io","owner":{"login":"kwalrath","id":2164483,"avatar_url":"https://avatars.githubusercontent.com/u/2164483?v=3","gravatar_id":"","url":"https://api.github.com/users/kwalrath","html_url":"https://github.com/kwalrath","followers_url":"https://api.github.com/users/kwalrath/followers","following_url":"https://api.github.com/users/kwalrath/following{/other_user}","gists_url":"https://api.github.com/users/kwalrath/gists{/gist_id}","starred_url":"https://api.github.com/users/kwalrath/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kwalrath/subscriptions","organizations_url":"https://api.github.com/users/kwalrath/orgs","repos_url":"https://api.github.com/users/kwalrath/repos","events_url":"https://api.github.com/users/kwalrath/events{/privacy}","received_events_url":"https://api.github.com/users/kwalrath/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kwalrath/angular.io","description":"Website for Angular 2","fork":true,"url":"https://api.github.com/repos/kwalrath/angular.io","forks_url":"https://api.github.com/repos/kwalrath/angular.io/forks","keys_url":"https://api.github.com/repos/kwalrath/angular.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kwalrath/angular.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kwalrath/angular.io/teams","hooks_url":"https://api.github.com/repos/kwalrath/angular.io/hooks","issue_events_url":"https://api.github.com/repos/kwalrath/angular.io/issues/events{/number}","events_url":"https://api.github.com/repos/kwalrath/angular.io/events","assignees_url":"https://api.github.com/repos/kwalrath/angular.io/assignees{/user}","branches_url":"https://api.github.com/repos/kwalrath/angular.io/branches{/branch}","tags_url":"https://api.github.com/repos/kwalrath/angular.io/tags","blobs_url":"https://api.github.com/repos/kwalrath/angular.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kwalrath/angular.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kwalrath/angular.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/kwalrath/angular.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kwalrath/angular.io/statuses/{sha}","languages_url":"https://api.github.com/repos/kwalrath/angular.io/languages","stargazers_url":"https://api.github.com/repos/kwalrath/angular.io/stargazers","contributors_url":"https://api.github.com/repos/kwalrath/angular.io/contributors","subscribers_url":"https://api.github.com/repos/kwalrath/angular.io/subscribers","subscription_url":"https://api.github.com/repos/kwalrath/angular.io/subscription","commits_url":"https://api.github.com/repos/kwalrath/angular.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/kwalrath/angular.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/kwalrath/angular.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/kwalrath/angular.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/kwalrath/angular.io/contents/{+path}","compare_url":"https://api.github.com/repos/kwalrath/angular.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kwalrath/angular.io/merges","archive_url":"https://api.github.com/repos/kwalrath/angular.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kwalrath/angular.io/downloads","issues_url":"https://api.github.com/repos/kwalrath/angular.io/issues{/number}","pulls_url":"https://api.github.com/repos/kwalrath/angular.io/pulls{/number}","milestones_url":"https://api.github.com/repos/kwalrath/angular.io/milestones{/number}","notifications_url":"https://api.github.com/repos/kwalrath/angular.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kwalrath/angular.io/labels{/name}","releases_url":"https://api.github.com/repos/kwalrath/angular.io/releases{/id}","created_at":"2015-11-16T23:07:08Z","updated_at":"2015-11-16T23:07:09Z","pushed_at":"2015-11-25T22:44:28Z","git_url":"git://github.com/kwalrath/angular.io.git","ssh_url":"git@github.com:kwalrath/angular.io.git","clone_url":"https://github.com/kwalrath/angular.io.git","svn_url":"https://github.com/kwalrath/angular.io","homepage":"https://angular.io","size":8895,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"angular:master","ref":"master","sha":"4bbd9784ef624dafbf812af0601335dae854589f","user":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"repo":{"id":31985425,"name":"angular.io","full_name":"angular/angular.io","owner":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/angular/angular.io","description":"Website for Angular 2","fork":false,"url":"https://api.github.com/repos/angular/angular.io","forks_url":"https://api.github.com/repos/angular/angular.io/forks","keys_url":"https://api.github.com/repos/angular/angular.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/angular/angular.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/angular/angular.io/teams","hooks_url":"https://api.github.com/repos/angular/angular.io/hooks","issue_events_url":"https://api.github.com/repos/angular/angular.io/issues/events{/number}","events_url":"https://api.github.com/repos/angular/angular.io/events","assignees_url":"https://api.github.com/repos/angular/angular.io/assignees{/user}","branches_url":"https://api.github.com/repos/angular/angular.io/branches{/branch}","tags_url":"https://api.github.com/repos/angular/angular.io/tags","blobs_url":"https://api.github.com/repos/angular/angular.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/angular/angular.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/angular/angular.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/angular/angular.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/angular/angular.io/statuses/{sha}","languages_url":"https://api.github.com/repos/angular/angular.io/languages","stargazers_url":"https://api.github.com/repos/angular/angular.io/stargazers","contributors_url":"https://api.github.com/repos/angular/angular.io/contributors","subscribers_url":"https://api.github.com/repos/angular/angular.io/subscribers","subscription_url":"https://api.github.com/repos/angular/angular.io/subscription","commits_url":"https://api.github.com/repos/angular/angular.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/angular/angular.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/angular/angular.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/angular/angular.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/angular/angular.io/contents/{+path}","compare_url":"https://api.github.com/repos/angular/angular.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/angular/angular.io/merges","archive_url":"https://api.github.com/repos/angular/angular.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/angular/angular.io/downloads","issues_url":"https://api.github.com/repos/angular/angular.io/issues{/number}","pulls_url":"https://api.github.com/repos/angular/angular.io/pulls{/number}","milestones_url":"https://api.github.com/repos/angular/angular.io/milestones{/number}","notifications_url":"https://api.github.com/repos/angular/angular.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/angular/angular.io/labels{/name}","releases_url":"https://api.github.com/repos/angular/angular.io/releases{/id}","created_at":"2015-03-10T22:32:34Z","updated_at":"2015-12-01T15:48:18Z","pushed_at":"2015-12-01T17:53:11Z","git_url":"git://github.com/angular/angular.io.git","ssh_url":"git@github.com:angular/angular.io.git","clone_url":"https://github.com/angular/angular.io.git","svn_url":"https://github.com/angular/angular.io","homepage":"https://angular.io","size":9912,"stargazers_count":141,"watchers_count":141,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":153,"mirror_url":null,"open_issues_count":65,"forks":153,"open_issues":65,"watchers":141,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/angular/angular.io/pulls/409"},"html":{"href":"https://github.com/angular/angular.io/pull/409"},"issue":{"href":"https://api.github.com/repos/angular/angular.io/issues/409"},"comments":{"href":"https://api.github.com/repos/angular/angular.io/issues/409/comments"},"review_comments":{"href":"https://api.github.com/repos/angular/angular.io/pulls/409/comments"},"review_comment":{"href":"https://api.github.com/repos/angular/angular.io/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/angular/angular.io/pulls/409/commits"},"statuses":{"href":"https://api.github.com/repos/angular/angular.io/statuses/084e4a40a8fe581cccf613c06df5761fae5db63a"}}}}