How to push to a FormArray([ ]) in angular 4

Saurabh Verma picture Saurabh Verma · Jan 15, 2018 · Viewed 11.9k times · Source

I have a reactive angular form that looks something like this.

 <form [formGroup]="myForm">
      <div *ngFor="let Repo of Repos;">
           <fieldset>
                <legend>{{Repo.name}}</legend>
                    <div class="checkbox checkbox-success">
                       <input
                            [id] = "Repo.id"
                            type="checkbox"   (change)="onChange(Repo.User,Repo.Commits,Repo.Requests,Repo.Contributors, Repo.Languages,Repo.Branches,Repo.Langs,$event.target.checked)">
                              <label [for] = "Repo.id">
                                 Select This Repository
                              </label>
                     </div>
            </fieldset>
       </div>
 </form>

Following is the typescript file:

export class AddUserComponent implements OnInit {
      githubUserResponse;
      githubReposResponse;
      myForm = new FormGroup({});
    ngOnInit(){
       this.myForm = new FormGroup({
            'userRepoData' : new FormGroup({
              'githubusers': new FormGroup({
                'username': new FormControl(null),
                'html_url': new FormControl(null),
                'name': new FormControl(null),
                'company': new FormControl(null),
                'location': new FormControl(null),
                'user_created_at': new FormControl(null),
                'user_updated_at': new FormControl(null),
                'public_repos': new FormControl(null),
                'public_gists': new FormControl(null),
                'githubrepos': new FormArray([]),
              }),
            }),
          });
    }
onChange(repo, commits, requests, contributors, branches, langs,  isChecked: boolean){
        if (!isChecked) {
         console.log('aayaa');
         (<FormArray>this.myForm.get('userRepoData.githubusers.githubrepos')).push(
           new FormGroup({
             'owner': new FormControl(repo.owner.login),
             'name': new FormControl(repo.name),
             'html_url': new FormControl(repo.html_url),
             'clone_url': new FormControl(repo.clone_url),
             'repo_created_at': new FormControl(repo.created_at),
             'repo_updated_at': new FormControl(repo.updated_at),
             'repo_pushed_at': new FormControl(repo.pushed_at),
             'public_repos': new FormControl(repo.public_repos),
             'no_of_commits': new FormControl(commits.length),
             'no_of_branches': new FormControl(branches.length),
             'no_of_pullrequests': new FormControl(requests.length),
             'no_of_contributors': new FormControl(contributors.length),
             'repobranches': new FormArray([]), //empty
             'repocommits': new FormArray([]), //empty
             'repocontributors': new FormArray([]), //empty
             'repolangs': new FormArray([]), //empty
             'repo_p_rs': new FormArray([]) //empty
           })
         );
         console.log(this.myForm.value);
  }
}

it can be seen in above FormGroup that the FormArrays :
1. repobranches
2. repocommits
3. repocontributors
4. repolang
5. repo_pr_s
are empty. now i want to push some arrays within these nested FormArrays.

for example following is the array i want to push to 'repocontributors' :

[
                    {
                        "login": "Saurabh0606",
                        "id": 21239899,
                        "avatar_url": "https://avatars2.githubusercontent.com/u/21239899?v=4",
                        "gravatar_id": "",
                        "url": "https://api.github.com/users/Saurabh0606",
                        "html_url": "https://github.com/Saurabh0606",
                        "followers_url": "https://api.github.com/users/Saurabh0707/followers",
                        "following_url": "https://api.github.com/users/Saurabh0707/following{/other_user}",
                        "gists_url": "https://api.github.com/users/Saurabh0707/gists{/gist_id}",
                        "starred_url": "https://api.github.com/users/Saurabh0707/starred{/owner}{/repo}",
                        "subscriptions_url": "https://api.github.com/users/Saurabh0707/subscriptions",
                        "organizations_url": "https://api.github.com/users/Saurabh0707/orgs",
                        "repos_url": "https://api.github.com/users/Saurabh0707/repos",
                        "events_url": "https://api.github.com/users/Saurabh0707/events{/privacy}",
                        "received_events_url": "https://api.github.com/users/Saurabh0707/received_events",
                        "type": "User",
                        "site_admin": false,
                        "contributions": 2
                    }


{
                            "login": "Saurabh0707",
                            "id": 21239898,
                            "avatar_url": "https://avatars2.githubusercontent.com/u/21239898?v=4",
                            "gravatar_id": "",
                            "url": "https://api.github.com/users/Saurabh0707",
                            "html_url": "https://github.com/Saurabh0707",
                            "followers_url": "https://api.github.com/users/Saurabh0707/followers",
                            "following_url": "https://api.github.com/users/Saurabh0707/following{/other_user}",
                            "gists_url": "https://api.github.com/users/Saurabh0707/gists{/gist_id}",
                            "starred_url": "https://api.github.com/users/Saurabh0707/starred{/owner}{/repo}",
                            "subscriptions_url": "https://api.github.com/users/Saurabh0707/subscriptions",
                            "organizations_url": "https://api.github.com/users/Saurabh0707/orgs",
                            "repos_url": "https://api.github.com/users/Saurabh0707/repos",
                            "events_url": "https://api.github.com/users/Saurabh0707/events{/privacy}",
                            "received_events_url": "https://api.github.com/users/Saurabh0707/received_events",
                        "type": "User",
                        "site_admin": false,
                        "contributions": 2
                    }
                ]   

similarly others also.

how am i supposed to do this..?
Help Required.
Thanks In Advance.

Answer

Andriy picture Andriy · Jan 15, 2018

As Imran mentioned I also recommend to use FormBuilder:

ngOnInit() {
  this.myForm = this._fb.group({
    userRepoData: this._fb.group({
      githubusers: this._fb.group({
        username: null,
        html_url: null,
        name: null,
        company: null,
        location: null,
        user_created_at: null,
        user_updated_at: null,
        public_repos: null,
        public_gists: null,
        githubrepos: this._fb.array([
          this._fb.group({
            owner: 'repo.owner.login',
            name: 'repo.name',
            html_url: 'repo.html_url',
            clone_url: 'repo.clone_url',
            repo_created_at: 'repo.created_at',
            repo_updated_at: 'repo.updated_at',
            repo_pushed_at: 'repo.pushed_at',
            repocontributors: this._fb.array([]), //empty
            repolangs: this._fb.array([]), //empty
          })
        ]),
      })
    })
  });
}

then just use push() method to push to your to array:

pushToArray() {
  const repocontributors = this.myForm.get('userRepoData.githubusers.githubrepos.0.repocontributors');
  (repocontributors as FormArray).push(this._fb.group({
    login: "Saurabh0606",
    id: 21239899,
    avatar_url: "https://avatars2.githubusercontent.com/u/21239899?v=4",
    gravatar_id: "",
    url: "https://api.github.com/users/Saurabh0606",
    html_url: "https://github.com/Saurabh0606",
    followers_url: "https://api.github.com/users/Saurabh0707/followers",
    following_url: "https://api.github.com/users/Saurabh0707/following{/other_user}",
    gists_url: "https://api.github.com/users/Saurabh0707/gists{/gist_id}",
    starred_url: "https://api.github.com/users/Saurabh0707/starred{/owner}{/repo}",
    subscriptions_url: "https://api.github.com/users/Saurabh0707/subscriptions",
    organizations_url: "https://api.github.com/users/Saurabh0707/orgs",
    repos_url: "https://api.github.com/users/Saurabh0707/repos",
    events_url: "https://api.github.com/users/Saurabh0707/events{/privacy}",
    received_events_url: "https://api.github.com/users/Saurabh0707/received_events",
    type: "User",
    site_admin: false,
    contributions: 2
  }));

  (repocontributors as FormArray).push(this._fb.group({
    login: "Saurabh0707",
    id: 21239898,
    avatar_url: "https://avatars2.githubusercontent.com/u/21239898?v=4",
    gravatar_id: "",
    url: "https://api.github.com/users/Saurabh0707",
    html_url: "https://github.com/Saurabh0707",
    followers_url: "https://api.github.com/users/Saurabh0707/followers",
    following_url: "https://api.github.com/users/Saurabh0707/following{/other_user}",
    gists_url: "https://api.github.com/users/Saurabh0707/gists{/gist_id}",
    starred_url: "https://api.github.com/users/Saurabh0707/starred{/owner}{/repo}",
    subscriptions_url: "https://api.github.com/users/Saurabh0707/subscriptions",
    organizations_url: "https://api.github.com/users/Saurabh0707/orgs",
    repos_url: "https://api.github.com/users/Saurabh0707/repos",
    events_url: "https://api.github.com/users/Saurabh0707/events{/privacy}",
    received_events_url: "https://api.github.com/users/Saurabh0707/received_events",
    type: "User",
    site_admin: false,
    contributions: 2
  }));
}

STACKBLITZ: https://stackblitz.com/edit/angular-ntx3sp?file=app%2Fapp.component.ts

Just press PUSH TO FORM ARRAY BUTTON.

This is how it looks before pushing: enter image description here

and here after:

enter image description here