【问题标题】:Angular service returning data only on page refreshAngular 服务仅在页面刷新时返回数据
【发布时间】:2018-07-12 09:12:20
【问题描述】:

为什么this.menulist 之后还是空的?

layout.component.ts

 ngOnInit() {


    this.menulist = localStorage.getItem('menulist');  

    if (this.menulist) {

    } else {
      this.SetMenuList(); // Else call the service and sort the menu then
    }
     this.menulist = localStorage.getItem('menulist'); // null even after calling  SetMenulist
     this.jsonmenulist = JSON.parse(this.menulist); 
    } 

    SetMenuList() {
        this._UserspecificmenuaccessService.getRMA("driver")
      .map((lst) => {
        if (lst && lst.length > 0) {
          console.log(lst);
          localStorage.setItem('menulist', JSON.stringify(lst));
          this.menulist = localStorage.getItem('menulist'); this.jsonmenulist = JSON.parse(this.menulist);          

        }
      }, (error) => {
        console.error(error)
      });
  }

服务方式:

  getRMA(Id:any): Observable<Imstmenu[]> {
     return this._http.get("http://172.19.32.235:3000/api/USMA/selectAll/"+Id+"")
    .map((response: Response) => {<Imstmenu[]>response.json(); 
    .catch(this.handleError);
    }

【问题讨论】:

  • 你写 lst 来记录。它显示了什么?
  • SetMenuList() 是一个异步函数,运行后的行并不意味着SetMenuList() 结束运行。
  • @Programmer 它只是没有出现......就像执行流程从未到达它。
  • @ibenjelloun 那我该怎么办?

标签: javascript angular angular5 angular2-services angular4-forms


【解决方案1】:

我建议创建一个Observable,如果可用,则从本地获取最后一个值,否则在更新本地存储后获取服务器值:

updateMenuListOnce$ 是一个Observable,它将调用服务器,更新本地存储并返回新值:

const updateMenuListOnce$ = 
  this._UserspecificmenuaccessService.getRMA("driver")
  .pipe(first(), 
   tap(menuList => localStorage.setItem('menulist', JSON.stringify(menuList)));

menuList$Observable 将返回本地存储中的值(如果可用),或者订阅之前声明的Observable

this.menuList$ = of(localStorage.getItem('menulist'))
.pipe(exhaustMap(menuList => 
   menuList ? of(<Imstmenu[]>menuList) : updateMenuListOnce$));

现在您只需订阅menuList$ 即可从本地存储(如果可用)或从服务器获取菜单列表。

【讨论】:

  • [ts] Argument of type '(menuList: string) =&gt; Observable&lt;Imstmenu[]&gt; | Observable&lt;string&gt;' is not assignable to parameter of type '(value: string, index: number) =&gt; ObservableInput&lt;Imstmenu[]&gt;'. Type 'Observable&lt;Imstmenu[]&gt; | Observable&lt;string&gt;' is not assignable to type 'ObservableInput&lt;Imstmenu[]&gt;'. Type 'Observable&lt;string&gt;' is not assignable to type 'ObservableInput&lt;Imstmenu[]&gt;'. Type 'Observable&lt;string&gt;' is not assignable to type 'ArrayLike&lt;Imstmenu[]&gt;'. Property 'length' is missing in type 'Observable&lt;string&gt;'.
  • 您只需要将menuList 转换为Imstmenu[],我编辑了代码。
猜你喜欢
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 2019-03-07
  • 2019-03-31
  • 2021-04-30
相关资源
最近更新 更多