ফর্মগ্রুপের জন্য কৌণিক 2 সেট মান


91

সুতরাং সত্তা তৈরির জন্য আমার একটি জটিল ফর্ম রয়েছে এবং আমি এটি সম্পাদনার জন্যও ব্যবহার করতে চাই পাশাপাশি আমি নতুন কৌণিক ফর্ম এপিআই ব্যবহার করছি। আমি ডাটাবেস থেকে প্রাপ্ত তথ্য হিসাবে ঠিক ফর্মটি কাঠামোবদ্ধ করেছি তাই আমি পুনরুদ্ধারকৃত ডেটাতে পুরো ফর্মের মান সেট করতে চাই আমি কী করতে চাই তার একটি উদাহরণ:

this.form = builder.group({
      b : [ "", Validators.required ],
      c : [ "", Validators.required ],
      d : [ "" ],
      e : [ [] ],
      f : [ "" ]
    });
this.form.value({b:"data",c:"data",d:"data",e:["data1","data2"],f:data});

পিএস: এনজিএমডেল এপিআই-র নতুন ফর্মগুলির সাথে কাজ করে না আমিও হিসাবে টেমপ্লেটে একমুখী ডেটা বাইন্ডিং বাঁধার ব্যবহার করতে আপত্তি করি না

<input formControlName="d" value="[data.d]" />

এটি কাজ করে তবে অ্যারেগুলির ক্ষেত্রে এটি একটি ব্যথা হবে


যতদূর আমি জানি যে ফর্মগুলির মান নির্ধারণ করা বর্তমানে সমর্থিত নয় এবং পরবর্তী আপডেটের পরে এটি সমর্থিত হবে (আরসি 5)। দয়া করে একটি প্লাঙ্কার সরবরাহ করুন।
গন্টার জ্যাচবাউর

@ গন্তেরজ্যাচবাউর আমার বর্তমান সমাধানটি পরীক্ষা করে দেখুন
আমগাদ সেরি

ডি আপনি দেখুন: github.com/angular/angular/blob/2.0.0-rc.5/modules/%40angular/… লাইন 553 ফর্মগ্রুপ.সেটভ্যালু ()?
ক্লিমেন্ট

উত্তর:


298

সমস্ত ফর্মগ্রুপ মান ব্যবহার করতে, সেটভ্যালু সেট করুন :

this.myFormGroup.setValue({
  formControlName1: myValue1, 
  formControlName2: myValue2
});

কেবলমাত্র কয়েকটি মান সেট করতে প্যাচভ্যালু ব্যবহার করুন :

this.myFormGroup.patchValue({
  formControlName1: myValue1, 
  // formControlName2: myValue2 (can be omitted)
});

এই দ্বিতীয় কৌশলটি দিয়ে, সমস্ত মান সরবরাহ করার দরকার নেই এবং মানগুলি সেট করা হয়নি এমন ক্ষেত্রগুলি প্রভাবিত হবে না।


4
আমি নেস্টেড ফর্মটিতে প্যাচভ্যালু ব্যবহার করছি এবং এটি ফর্মের সমস্ত ক্ষেত্রকে ওভাররাইট করছে। (এমনকি আমি যাদের নির্দিষ্ট করে দিইনি) কোন ধারণা আমি কী ভুল করছি?
এনরিকো

9

সেট মানটির জন্য যখন আপনার নিয়ন্ত্রণ ফর্মগ্রুপ হয় এই উদাহরণটি ব্যবহার করতে পারে

this.clientForm.controls['location'].setValue({
      latitude: position.coords.latitude,
      longitude: position.coords.longitude
    });

5

হ্যাঁ আপনি সম্পাদনা / আপডেটের উদ্দেশ্যে মান সেট করতে সেটভ্যালু ব্যবহার করতে পারেন।

this.personalform.setValue({
      name: items.name,
      address: {
        city: items.address.city,
        country: items.address.country
      }
    });

সেটভ্যালু ব্যবহার করে কীভাবে অ্যাড / এডিট বৈশিষ্ট্যটির জন্য প্রতিক্রিয়াশীল ফর্মগুলি ব্যবহার করতে হয় তা বুঝতে আপনি http://musttoknow.com/use-angular-reactive-form-addinsert-update-data-using-setvalue-setpatch/ উল্লেখ করতে পারেন। এটা আমার সময় সাশ্রয়


5

আপনি নির্দিষ্ট নিয়ন্ত্রণ অবজেক্টটি পেতে form.get ব্যবহার করতে পারেন এবং সেটভ্যালু ব্যবহার করতে পারেন

this.form.get(<formControlName>).setValue(<newValue>);

3

মন্তব্যে নির্দেশিত হিসাবে, এই প্রশ্নটি জিজ্ঞাসা করার সময় এই বৈশিষ্ট্যটি সমর্থন করা হয়নি। এই সমস্যাটি কৌনিক 2 আরসি 5 এ সমাধান করা হয়েছে


2

আমি কৌণিক 2 সমর্থন ফর্ম আপডেট ভ্যালু না হওয়া পর্যন্ত একটি অস্থায়ী সমাধান প্রয়োগ করেছি

 initFormGroup(form: FormGroup, data: any) {
        for(var key in form.controls) {
          console.log(key);
          if(form.controls[key] instanceof FormControl) {
            if(data[key]){
              let control = <FormControl>form.controls[key];
              this.initFormControl(control,data[key]);
            }
          } else if(form.controls[key] instanceof FormGroup) {
            if(data[key]){
              this.initFormGroup(<FormGroup>form.controls[key],data[key]);
            }
          } else if(form.controls[key] instanceof FormArray) {
            var control = <FormArray>form.controls[key];
            if(data[key])
            this.initFormArray(control, data[key]);
          }
        }
      }
      initFormArray(array: FormArray, data: Array<any>){
    if(data.length>0){
      var clone = array.controls[0];
      array.removeAt(0);
      for(var idx in data) {
        array.push(_.cloneDeep(clone));
        if(clone instanceof FormGroup)
          this.initFormGroup(<FormGroup>array.controls[idx], data[idx]);
        else if(clone instanceof FormControl)
          this.initFormControl(<FormControl>array.controls[idx], data[idx]);
        else if(clone instanceof FormArray)
          this.initFormArray(<FormArray>array.controls[idx], data[idx]);
      }
    }
  }


initFormControl(control: FormControl, value:any){
    control.updateValue(value);
  }

ব্যবহার:

this.initFormGroup(this.form, {b:"data",c:"data",d:"data",e:["data1","data2"],f:data});

দ্রষ্টব্য: ফর্ম এবং ডেটাতে অবশ্যই একই কাঠামো থাকতে হবে এবং আমি ডিপ ক্লোনিং jQuery এর জন্য লড্যাশ ব্যবহার করেছি এবং অন্যান্য লিবগুলিও এটি করতে পারে


0

"এনজিএমডেল এপিআই-র নতুন ফর্মগুলির সাথে কাজ করে না"।

এটা সত্যি না. আপনার কেবল এটি সঠিকভাবে ব্যবহার করা দরকার। যদি আপনি প্রতিক্রিয়াশীল ফর্মগুলি ব্যবহার করেন তবে এনজিএমডেলটি প্রতিক্রিয়াশীল নির্দেশনার সাথে কনসার্টে ব্যবহার করা উচিত । উত্স উদাহরণ দেখুন ।

/*
 * @Component({
 *      selector: "login-comp",
 *      directives: [REACTIVE_FORM_DIRECTIVES],
 *      template: `
 *        <form [formGroup]="myForm" (submit)='onLogIn()'>
 *          Login <input type='text' formControlName='login' [(ngModel)]="credentials.login">
 *          Password <input type='password' formControlName='password'
 *                          [(ngModel)]="credentials.password">
 *          <button type='submit'>Log in!</button>
 *        </form>
 *      `})
 * class LoginComp {
 *  credentials: {login:string, password:string};
 *  myForm = new FormGroup({
 *    login: new Control(this.credentials.login),
 *    password: new Control(this.credentials.password)
 *  });
 *
 *  onLogIn(): void {
 *    // this.credentials.login === "some login"
 *    // this.credentials.password === "some password"
 *  }
 * }
 */

যদিও এটি টোডো মন্তব্য থেকে দেখে মনে হচ্ছে , এটি সম্ভবত মুছে ফেলা হবে এবং একটি প্রতিক্রিয়াশীল এপিআই দ্বারা প্রতিস্থাপন করা হবে।

// TODO(kara):  Replace ngModel with reactive API
@Input('ngModel') model: any;

অ্যাঙ্গুলার 2 এপিআই ডক্স এনজিএমডেল সিলেক্টর [এনজিএমডেল] থেকে আসছে: না ([formControlName]): নয় ([formControl]) কৌণিক.ইও / ডকস /ts/latest/api/forms/ index/… তাই এখন এটি যদি কাজ করে তবে তা হবে পরে মুছে ফেলা হয়েছে আমি মনে করি আমি একটি ম্যানুয়াল মান ইনজেক্টর বাস্তবায়ন করব কারণ এটি আরও স্থিতিশীল সমাধান হবে
আমগাদ সেরি

@ আমগাডসারি এটি নিশ্চিত করে যে এটি সেই উপাদানগুলির সাথে (বাছাইকারীকে) বাধা দেয় না। FormControlNameস্পষ্টভাবে একটি যেমন যোগ @Input()। আমি সংযুক্ত উত্স দেখুন। যদি এই উপেক্ষাকারী নির্বাচকরা না থাকেন তবে উপরের উদাহরণ দিয়ে একটি এনজিএমডেল তৈরি করা হবে যা আপনি চান না।
পল সামসোথা

এটি কিছুটা বিভ্রান্তিকর, তবে এটি কার্যকরভাবে কার্যকর হয়। FormControlDirective( [formControl]) এবং FormControlName( formControlName) উভয়ের জন্যই এটি কাজ করে। যদি ngModelসেগুলির মধ্যে একটি ছাড়াই ব্যবহৃত হয়, তবে ধরে নেওয়া হয় আপনি ঘোষণামূলক ফর্মগুলি ব্যবহার করবেন , এবং একটি NgModelতৈরি করা হবে। যদি প্রতিক্রিয়াশীল ফর্মের দিকনির্দেশগুলির মধ্যে একটির পাশাপাশিngModel এটি ব্যবহার করা হয়, তবে সেই প্রতিক্রিয়াশীল ফর্ম নির্দেশটি মডেলটিকে পরিচালনা করবে, একটি নয়NgModel
পল সামসোথা

ওহ আমি ভেবেছিলাম যে তারা হ্যাক হিসাবে কেবলমাত্র আপাতত এই দুটি নির্দেশকে এনজিমডেল সক্ষম করতে পেরেছিল এবং তারা এটি পরে সরিয়ে ফেলবে
আমগাদ সেরি

আমার বর্তমান সমাধানটি পরীক্ষা করুন
আমগাদ সেরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.