【问题标题】:How to avoid using Object.assign?如何避免使用 Object.assign?
【发布时间】:2017-07-09 16:46:12
【问题描述】:

我正在运行一个函数来获取类别列表,并为每个类别获取一个 id 并运行另一个函数来获取我已获得 id 的特定类别中的“链接”数量。

为此,我有以下代码:

ngOnInit(): void
    {
        this.categories = this.categoryService.getCategories();
        const example = this.categories.mergeMap((categor) => categor.map((myCateg) =>
            {
            this.categoryService.countCategoryLinks(myCateg.id)
                .map(numlinks => Object.assign(myCateg,{numLinks: numlinks}))
                .subscribe(valeur => console.log(valeur));
            return myCateg.id
        }));

       example.subscribe(val => console.log("valeur2: "+val));
    }

getCategories() 在哪里:

getCategories(): Observable<any>
        {
         return this.category.find({where: {clientId: this.userApi.getCurrentId()}})

    };

countCategoryLinks() 是:

countCategoryLinks(id: number): Observable<any>
    {
    return this.category.countLinks(id)
    };

出现,如下截图所示:

numlinks 是一个对象。当然这是由 Object.assign 完成的。

有没有办法像 categoryName ot clientId 而不是 Object 那样插入“计数”?

我的目标是能够显示模板中的所有值

<tr *ngFor="let category of categories | async; let id = index">
                    <td>
                        <label class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect mdl-data-table__select"
                               for="row[3]">
                            <input type="checkbox" id="row[3]" class="mdl-checkbox__input"/>
                        </label>
                    </td>
                    <td class="mdl-data-table__cell--non-numeric"><a [routerLink]="['/category/links']"></a>{{
                        category.categoryName }}
                    </td>
                     <td class="mdl-data-table__cell--non-numeric">{{category.numLinks}}</td>
                     <td #category.id><i (click)="deleteCategory(id)" class="material-icons">delete</i></td>
                </tr>

【问题讨论】:

  • 你能以你想要的方式给出一个输出样本吗?
  • “this.category.countLinks(id)”是做什么的?
  • 我已经添加了我的模板代码。
  • this.category.countLinks(id) 计算我使用 getCategories() 获得的特定 id 的链接数。 id是控制台中显示的Category的Id字段。

标签: javascript angular typescript ecmascript-6 observable


【解决方案1】:

如果我理解正确,那么您可以这样做:

.map(numlinks => {
  myCateg.numLinks = numlinks.count;
  return myCateg;
})

代替

.map(numlinks => Object.assign(myCateg,{numLinks: numlinks}))

因此你的代码应该是这样的:

{
  this.categories = this.categoryService.getCategories();

  const example = this.categories
    .mergeMap((categor) => categor
      .map((myCateg) => {

        this.categoryService
          .countCategoryLinks(myCateg.id)
          .map(numlinks => {
            myCateg.numLinks = numlinks.count;
            return myCateg;
          })
          .subscribe(valeur => console.log(valeur));

        return myCateg.id;
      }));

  example.subscribe(val => console.log("valeur2: " + val));
}

【讨论】:

  • 我应该写 .map(numlinks => myCateg.numlinks = numlinks.count) 吗?这不再在控制台中显示任何内容。
  • 这不起作用:{ this.categories = this.categoryService.getCategories();常量示例 = this.categories.mergeMap((categor) => categor.map((myCateg) => { this.categoryService.countCategoryLinks(myCateg.id) .map(numlinks => { myCateg.numlinks = numlinks.count; return myCateg.id }); example.subscribe(val => console.log("valeur2: "+val)); })) }
  • 刚刚用我的编辑了源代码。它不起作用。
  • 我注意到您返回的是 myCateg.id 而不是 myCateg
  • 是的,因为我需要获取 id 才能运行 count(id)。仅尝试使用 myCateg。同样的问题。是 .subscribe(valeur => console.log(valeur));应该写在控制台?现在什么都没有显示。这很奇怪。此外,在我的模板中,我显示了 categories.CategoryName。所以我认为我应该在所有操作结束时设置类别变量。你怎么看?
【解决方案2】:

改变这一行:

.map(numlinks => Object.assign(myCateg,{numLinks: numlinks}))

到:

.map(numlinks => Object.assign(myCateg, { numLinks: numlinks.count }))

【讨论】:

  • 控制台中的 "undefined" 和模板中的 {{category.numLinks}} 未显示。
  • @PhilippeCorrèges 更新了答案。再试一次。
  • @PhilippeCorrèges,这似乎是正确的答案,不是吗?这是您遇到的唯一问题:您分配了 numlinks(具有计数属性的对象),但想要 numlinks.count(仅数字)。
  • 作为一部分,因为它没有在我的模板中显示:{{category.numlinks}} 而 {{category.categoryName}} 显示。
猜你喜欢
  • 2017-04-09
  • 2011-11-02
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多