Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建多模态方法Javascript?_Javascript_Angular_Typescript - Fatal编程技术网

如何创建多模态方法Javascript?

如何创建多模态方法Javascript?,javascript,angular,typescript,Javascript,Angular,Typescript,我试着创造一些 如何编写UpdatesPDATA方法, 如果获取类型为stepOneData的数据,则会更改stepOneData 如果获取类型为stepOneData的数据,是否会更改stepTwoData updateStepData(data: StepOneData | StepTwoData): void { Object.keys(data).map(key => { // if (data instanceof StepOneData) {

我试着创造一些

如何编写UpdatesPDATA方法, 如果获取类型为stepOneData的数据,则会更改stepOneData 如果获取类型为stepOneData的数据,是否会更改stepTwoData

  updateStepData(data: StepOneData | StepTwoData): void {
     Object.keys(data).map(key => {
       // if (data instanceof StepOneData) {
          this.stepOneData[key] = data[key];
       // } 

       // if (data instanceof StepTwoData) {
          this.stepTwoData[key] = data[key];
       // } 
     });
  }

我已尝试使用instanceof运算符,但在这里它不起作用。

我在Step1组件中找到了此方法:

onFormChanges(): void {
    this.stepOneForm.valueChanges
      .subscribe((data: StepOneData) => {

        this.registrationService.updateStepData(data);
      });
}
更改如下:

onFormChanges(): void {
    this.stepOneForm.valueChanges
      .subscribe((data: StepOneData) => {

        const stepOneData = new StepOneData();

        stepOneData.firstName = data.firstName;
        stepOneData.firstName = data.lastName;      

        this.registrationService.updateStepData(stepOneData);
      });
}
export class StepTwoData {

  constructor(public city:string,public state:string){}

}
对Step2组件执行相同的操作

现在,您可以使用您在代码中编写的instanceof:

   if (data instanceof StepOneData) {
    this.stepOneData[key] = data[key];
  } 

  if (data instanceof StepTwoData) {
     this.stepTwoData[key] = data[key];
  } 
=========================================

要生成可读代码,您可以向StepOneData和StepTwoData类中添加constrcutor以初始化其属性,如下所示:

onFormChanges(): void {
    this.stepOneForm.valueChanges
      .subscribe((data: StepOneData) => {

        const stepOneData = new StepOneData();

        stepOneData.firstName = data.firstName;
        stepOneData.firstName = data.lastName;      

        this.registrationService.updateStepData(stepOneData);
      });
}
export class StepTwoData {

  constructor(public city:string,public state:string){}

}
在您的组件中:

 onFormChanges(): void {
    this.stepTwoForm.valueChanges
      .subscribe((data: StepTwoData) => {

        const stepTwoData= new StepTwoData(data.city,data.state);    

        this.registrationService.updateStepData(stepTwoData);
      });
}
==========================

更新:

为了更好的设计,我建议你为每种类型写两种方法。例如“UpdatesPoneData”和“UpdateStepTwoData”

如果这些方法中存在共享逻辑,则将其放入名为“UpdatesEdata”的方法中


关键变量来自哪里?如果你说它不工作,什么不工作,你期望什么行为?它应该工作,请发布你函数的输入。我使用
data.constructor.name
检查了类型,你的类型就是Object。因此,您在行的某个位置传递了错误的类型。sence in data变量。我在subscribe:stepForm.valueChanges.subscribe(数据=>{this.updatestpdata(数据)})中得到它。在那个地方,我可以创建新的StepOneData(),并手动将数据中的值复制到这个新对象,这样InAsceof就可以工作了。这是我的决定。但我们如何自动管理subcribe()中数据变量的类型很有趣。很酷,谢谢@Soroush_Neshat。这正是我想要的。你如何@Soroush_Neshat认为,最好使用两种方法:第一种是UpdateSp1Data(),第二种是UpdateSp2Data(),而不是univesal UpdateSpData()?。哪一种方法更有效?或者我可以使用第二个参数创建UpdatesPDATA(),当调用此方法时,通过步骤=1或步骤=2。。。然后在方法中使用它。有一个更好的解决方案。目前我在公共汽车和铁路超高类型代码。我回家后会分享:)@ValeryLutsevich抱歉,我完全忘了分享我的解决方案。我很抱歉。我在上面的答案中添加了解决方案