Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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_Rxjs_Observable - Fatal编程技术网

Javascript 角度和角度观测值

Javascript 角度和角度观测值,javascript,angular,rxjs,observable,Javascript,Angular,Rxjs,Observable,我是一个新的观察者,我有一个超级艰难的时间试图了解它是如何工作的 我有一些获取JSON文件数据的代码,但我没有在我的ngOninit上获取它,我假设这是因为代码是异步的。我想设置一个observable来订阅数据,但我对observable一无所知 这是代码 fetch('./assets/data/vendor.json').then(res => res.json()) .then(data => { this.vendorData = data.ve

我是一个新的观察者,我有一个超级艰难的时间试图了解它是如何工作的

我有一些获取JSON文件数据的代码,但我没有在我的ngOninit上获取它,我假设这是因为代码是异步的。我想设置一个observable来订阅数据,但我对observable一无所知

这是代码

fetch('./assets/data/vendor.json').then(res => res.json())
      .then(data => {
        this.vendorData = data.vendors;
        this.vendorService.setVendors(this.vendorData);
      });
  }
  ngOnInit() {
    this.filteredVendor = this.vendorService.getVendors();
    this.isfiltered = true;
    console.log(this.filteredVendor)
  }
关于我如何做到这一点,你有什么好的指导或教训可以告诉我,让我学习观察到的东西吗

谢谢你的帮助。

试试:

ngOnInit() {
  this.vendorService.getVendors().subscribe(
    venders => this.filteredVendor = venders;
    this.isFiltered = true;
    console.log(this.filteredVendor);
  );
}
至于学习它,我只会不断地练习它,看看如何做事。这些教程可能已经过时了,但它们对我有好处()但是语法可能有点过时,但是要学习新语法,并不是那么难

将可观测数据视为可以使用运算符修改的数据流。为了正确地学习它,你必须把手弄脏,并继续努力解决与之相关的问题。当您陷入困境时,请继续在Stackoverflow上发布,或查看其他人的解决方案。

尝试:

ngOnInit() {
  this.vendorService.getVendors().subscribe(
    venders => this.filteredVendor = venders;
    this.isFiltered = true;
    console.log(this.filteredVendor);
  );
}
至于学习它,我只会不断地练习它,看看如何做事。这些教程可能已经过时了,但它们对我有好处()但是语法可能有点过时,但是要学习新语法,并不是那么难


将可观测数据视为可以使用运算符修改的数据流。为了正确地学习它,你必须把手弄脏,并继续努力解决与之相关的问题。当你陷入困境时,继续在Stackoverflow上发帖,或者查看其他人的解决方案。

在你的
获取
方法之后,你似乎使用了
。然后
建议你有承诺,而不是可观察的。我建议您在服务中使用Rxjs中的
from
方法将您的承诺转换为可观察的。或者,你可以从中创建一个主题

假设
this.vendorService.getVendors()
返回一个可观察的,您将不得不订阅它,就像他在回答中建议的@AliF50一样:

//Inside your get method in your service:

public getVendors(): Vendor[] {
  return from(fetch('./assets/data/vendor.json')).pipe(map(
    result => result.json()
  ));
}
现在,您将通过调用
getVendors()
获得一个可观察到的结果

建议: 由于您是角度观测方面的新手,我将建议一种解决方案,这可能是您应用程序的一个很好的改进:

如果你使用可观测值和角度,你也可以研究路由器的解析功能。阅读更多

为您的供应商创建一个
VendorResolver

@Injectable({ providedIn: 'root' })
export class VendorResolver implements Resolve<Vendor> {
  constructor(private vendorService: VendorService) {}

  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<Vendor[]> {
    return this.vendorService.getVendors();
  }
}
现在,您可以在路线中执行以下操作:

@NgModule({
  imports: [
    RouterModule.forRoot([
      {
        path: 'vendors',
        component: VendorComponent,
        resolve: {
          vendors: VendorResolver
        }
      }
    ])
  ],
  exports: [RouterModule]
})
export class AppRoutingModule {}
当路由到“供应商”路由时,路由器将使用
vendorsolver
自动解析您的供应商。请注意,如果不解决问题,路由将无法完成

VendorComponent
中,您可以直接从路由快照数据访问供应商:

class VendorsComponent {
  constructor(private route: ActivatedRoute) {
  }

  public ngOnInit() {
    this.filteredVendor = this.route.snapshot.data.vendors;
  }
}
这使得组件中的代码非常少;除了
ActivatedRoute
之外,无需注入任何内容来解析您的供应商


注意:上面的代码是在这里编写的,简化了一点(例如,组件类远未完成),我跳过了导入语句。我尽量做到准确和完整,但如果您有问题或遇到问题,请留下评论,然后我可以在必要时添加一些详细信息。

在您的
获取
方法之后,您似乎使用了
。然后
建议您有承诺,而不是可观察的。我建议您在服务中使用Rxjs中的
from
方法将您的承诺转换为可观察的。或者,你可以从中创建一个主题

假设
this.vendorService.getVendors()
返回一个可观察的,您将不得不订阅它,就像他在回答中建议的@AliF50一样:

//Inside your get method in your service:

public getVendors(): Vendor[] {
  return from(fetch('./assets/data/vendor.json')).pipe(map(
    result => result.json()
  ));
}
现在,您将通过调用
getVendors()
获得一个可观察到的结果

建议: 由于您是角度观测方面的新手,我将建议一种解决方案,这可能是您应用程序的一个很好的改进:

如果你使用可观测值和角度,你也可以研究路由器的解析功能。阅读更多

为您的供应商创建一个
VendorResolver

@Injectable({ providedIn: 'root' })
export class VendorResolver implements Resolve<Vendor> {
  constructor(private vendorService: VendorService) {}

  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Observable<Vendor[]> {
    return this.vendorService.getVendors();
  }
}
现在,您可以在路线中执行以下操作:

@NgModule({
  imports: [
    RouterModule.forRoot([
      {
        path: 'vendors',
        component: VendorComponent,
        resolve: {
          vendors: VendorResolver
        }
      }
    ])
  ],
  exports: [RouterModule]
})
export class AppRoutingModule {}
当路由到“供应商”路由时,路由器将使用
vendorsolver
自动解析您的供应商。请注意,如果不解决问题,路由将无法完成

VendorComponent
中,您可以直接从路由快照数据访问供应商:

class VendorsComponent {
  constructor(private route: ActivatedRoute) {
  }

  public ngOnInit() {
    this.filteredVendor = this.route.snapshot.data.vendors;
  }
}
这使得组件中的代码非常少;除了
ActivatedRoute
之外,无需注入任何内容来解析您的供应商


注意:上面的代码是在这里编写的,简化了一点(例如,组件类远未完成),我跳过了导入语句。我尽量做到准确和完整,但如果您有问题或遇到问题,请留下评论,然后我可以在必要时添加一些详细信息。

感谢您的见解,我将继续尝试。感谢您的见解,我将继续尝试。