【问题标题】:Angular: Cannot find a differ supporting object '[object Object]'Angular:找不到不同的支持对象“[object Object]”
【发布时间】:2018-04-10 22:57:11
【问题描述】:

我正在关注this tutorial。在从 api.github 获取用户列表的路上我收到错误:

找不到不同的支持对象“[object Object]”

我认为它与

有关
 <ul>
 <li *ngFor = "#user of users">
 {{user | json}}
 </li>
 </ul>

在我的代码中,因为之前没有任何错误,并且我不确定数据是否来自获取请求,只需单击没有给出任何错误,这是我的代码到目前为止

@Component({
selector: 'router',
pipes : [],

template: `
<div>
<form [ngFormModel] = "searchform">
      <input type = 'text' [ngFormControl]= 'input1'/>
</form>
     <button (click) = "getusers()">Submit</button>
</div>
<div>
<ul>
    <li *ngFor = "#user of users">
    {{user | json}}
    </li>
</ul>
</div>
<router-outlet></router-outlet>
`,
directives: [FORM_DIRECTIVES]
})
export class router {
searchform: ControlGroup;
users: Array<Object>[];
input1: AbstractControl;

constructor(public http: Http, fb: FormBuilder) {
    this.searchform = fb.group({
        'input1': ['']
    })
    this.input1 = this.searchform.controls['input1']
}
getusers() {
    this.http.get(`https://api.github.com/
search/users?q=${this.input1.value}`)
        .map(response => response.json())
        .subscribe(
        data => this.users = data,
        error => console.log(error)
        )
}
}
bootstrap(router, [HTTP_PROVIDERS])

【问题讨论】:

    标签: angular angular2-routing angular2-directives angular2-http


    【解决方案1】:

    我认为您在响应负载中收到的对象不是数组。也许您要迭代的数组包含在一个属性中。您应该检查接收到的数据的结构...

    你可以试试这样的:

    getusers() {
      this.http.get(`https://api.github.com/search/users?q=${this.input1.value}`)
        .map(response => response.json().items) // <------
        .subscribe(
          data => this.users = data,
          error => console.log(error)
        );
    }
    

    编辑

    按照 Github doc (developer.github.com/v3/search/#search-users),响应的格式为:

    {
      "total_count": 12,
      "incomplete_results": false,
      "items": [
        {
          "login": "mojombo",
          "id": 1,
          (...)
          "type": "User",
          "score": 105.47857
        }
      ]
    }
    

    所以用户列表包含在items 字段中,你应该使用这个:

    getusers() {
      this.http.get(`https://api.github.com/search/users?q=${this.input1.value}`)
        .map(response => response.json().items) // <------
        .subscribe(
          data => this.users = data,
          error => console.log(error)
        );
    }
    

    【讨论】:

    • 通过执行此错误没有显示也没有显示用户,console.log 为空
    • 你应该使用items。有关响应负载的格式,请参阅此文档:developer.github.com/v3/search/#search-users。这对应于响应负载中的用户数组...我更新了答案
    • 对我来说,发生错误是因为我有一个模板变量(例如&lt;div #users&gt;),它与我使用 ngFor 数据设置的变量同名。所以 Angular 用模板变量覆盖了我的变量。 掌心
    【解决方案2】:

    我在代码中收到此错误,因为我没有运行 JSON.parse(result)

    所以我的结果是一个字符串而不是一个对象数组。

    即我得到了:

    "[{},{}]" 
    

    代替:

    [{},{}]
    

    import { Storage } from '@ionic/storage';
    ...
    private static readonly SERVER = 'server';
    ...
    getStorage(): Promise {
      return this.storage.get(LoginService.SERVER);
    }
    ...
    this.getStorage()
      .then((value) => {
         let servers: Server[] = JSON.parse(value) as Server[];
                       }
      );
    

    【讨论】:

      【解决方案3】:

      输入属性周围缺少方括号可能会导致此错误。 例如:

      Component Foo {
          @Input()
          bars: BarType[];
      }
      

      正确:

      &lt;app-foo [bars]="smth"&gt;&lt;/app-foo&gt;

      不正确(触发错误):

      &lt;app-foo bars="smth"&gt;&lt;/app-foo&gt;

      【讨论】:

      • 我因此损失了一个小时! - 谢谢!
      【解决方案4】:

      让我不止一次感到困惑的是页面上有另一个同名的变量。

      例如在下面的示例中,NgFor 的数据位于变量 requests 中。 但是还有一个名为 #requests 的变量用于 if-else

      <ng-template #requests>
        <div class="pending-requests">
          <div class="request-list" *ngFor="let request of requests">
            <span>{{ request.clientName }}</span>
          </div>
        </div>
      </ng-template>
      

      【讨论】:

      • 这似乎是这个错误的一个相当常见的原因,它只是让我感到难过。谢谢!
      【解决方案5】:

      解释: 您可以在数组上使用 *ngFor。您将用户声明为数组。但是,来自 Get 的响应会返回一个对象。您不能对对象进行 ngFor。你应该有一个数组。您可以将对象显式转换为数组,这将解决问题。 数据到[数据]

      解决方案

      getusers() {
          this.http.get(`https://api.github.com/
      search/users?q=${this.input1.value}`)
              .map(response => response.json())
              .subscribe(
              data => this.users = [data], //Cast your object to array. that will do it.
              error => console.log(error)
              )
      

      【讨论】:

        【解决方案6】:

        这个荒谬的错误信息仅仅意味着绑定到一个不存在的数组。

        <option
          *ngFor="let option of setting.options"
          [value]="option"
          >{{ option }}
        </option>
        

        在上面的示例中,setting.options 的值是未定义的。要修复,请按 F12 并打开开发人员窗口。当 get 请求返回数据时,查找包含数据的值。

        如果数据存在,则确保绑定名称正确

        //was the property name correct? 
        setting.properNamedOptions
        

        如果数据存在,它是一个数组吗?

        如果数据不存在,则在后端修复它。

        【讨论】:

        • 解决了我无法循环遍历Wordpress标签ID数据的问题,格式为[...{"tags": [2,3,4],}...]
        【解决方案7】:

        如果这是在 HTML 中返回的 Observable,只需添加异步管道

        可观察的 |异步

        【讨论】:

          【解决方案8】:

          如果你没有数组,但你试图像数组一样使用你的 observable,即使它是一个对象流,这将无法在本机工作。我将在下面展示如何解决此问题。

          如果您尝试使用其源为 BehaviorSubject 类型的 observable,请将其更改为 ReplaySubject,然后在您的组件中像这样订阅它:

          组件

          this.messages$ = this.chatService.messages$.pipe(scan((acc, val) => [...acc, val], []));
          

          HTML

          <div class="message-list" *ngFor="let item of messages$ | async">
          

          【讨论】:

            猜你喜欢
            • 2021-11-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-15
            • 2019-03-05
            • 1970-01-01
            • 2018-01-13
            相关资源
            最近更新 更多