【问题标题】:EXCEPTION: Cannot find a differ supporting object 'storeApps' in [apps in AppWidgetsComponent@8:28]例外:在 [AppWidgetsComponent@8:28 中的应用程序] 中找不到不同的支持对象“storeApps”
【发布时间】:2016-03-03 11:25:51
【问题描述】:

好的,我有一个很多人似乎都遇到过的问题,但 stackoverflow 或 GitHub 上的解决方案似乎都没有帮助。

我收到一个错误:

EXCEPTION: Cannot find a differ supporting object 'storeApps' in [apps in AppWidgetsComponent@8:28]

我认为这是由 ngFor 引起的:

<div class="container app-widgets">
    <div class="row">
        <div class="col-sm-10 col-sm-offet-1">
            <div class="container">
                <div class="row">
                    <ul>
                        <li *ngFor="#widget of apps"></li>
                    </ul>
                </div>
            </div>
        </div>
    </div>
</div>

对应的组件定义为:

import { Component, Input } from 'angular2/core';
import { NgFor } from 'angular2/common';
import { AppWidgetComponent } from '../appwidget/appwidget.component';
import { StoreApp } from '../../models';

@Component({
    selector: 'app-widgets',
    template: require('./appwidgets.component.html'),
    styles: [require('../../../sass/appwidgets.scss').toString()],
    directives: [AppWidgetComponent]
})
export class AppWidgetsComponent {
    @Input() apps: Array<StoreApp>;
}

我正在像这样使用app-widgets 组件:

<app-widgets apps=storeApps></app-widgets>

我在对应的组件定义中设置storeApps

@Component({
    selector: 'home',
    template: require('./home.component.html'),
    styles: [require('../../../sass/home.scss').toString()],
    directives: [AppWidgetsComponent, RecommendedRecentComponent]
})
export class HomeComponent {
    private storeApps: Array<StoreApp>;

    constructor(private _appsService: AppsService) {
    }

    recentSelected() {
        this._appsService.getRecentApps()
            .subscribe(
                storeApps => {
                    this.storeApps = storeApps;
                    this.storeApps.forEach(element => {
                        console.log(JSON.stringify(element));
                        console.log();
                    })
                },
                (error: any) => AppComponent.generalError(error.status)
            );
    }
}   

AppService.getRecentApps() 方法如下所示:

public getRecentApps() {
    return this.http.get(`${appSettings.apiRoot}resources/recent`)
        .map(res => <StoreApp[]> res.json().data)
        .catch(this.handleError);
}

让我感到困惑的是,为什么它抱怨的是出现在应用程序组件中的storeApps,而不是出现在app-widgets 组件中的apps

大家有什么想法吗?

【问题讨论】:

    标签: javascript angular rxjs


    【解决方案1】:

    在您的代码中:

    <app-widgets apps=storeApps></app-widgets>
    

    等价于这个表达式(它将属性值设置为字符串"storeApps"):

    <app-widgets [attr.apps]="'storeApps'"></app-widgets>
    

    你应该使用:

    <app-widgets [apps]="storeApps"></app-widgets>
    

    【讨论】:

    • 其实我不认为“is a shorthand for”是真的。 &lt;app-widgets apps=storeApps&gt;&lt;/app-widgets&gt; 只是传递给浏览器以添加到 DOM 中,而 &lt;app-widgets [attr.apps]="'storeApps'"&gt;&lt;/app-widgets&gt; 是由 Angular 处理的模板绑定。没错,结果是一样的,但我不会说这是简写。
    • @GünterZöchbauer 更新了答案。谢谢 (;
    • 我目前正在外出,无法测试您的建议,但会在几周内测试您的建议。非常感谢。
    • @GünterZöchbauer, apps="storeApps" 是根据Savkin's blog post[apps]=" 'storeApps' " 的简写(参见传递常量部分)。 Sasxa,注意速记绑定到apps 属性,而不是HTML 属性,所以它不等同于[attr.apps]=" '...' ",而是[apps]=" '...' "。 (这就是为什么我真的不喜欢这种速记语法,因为它看起来像属性绑定。)
    • @MarkRajcok 我会这样解释:someattr="some" 基本上是非 Angular HTML(它不受任何 Angular 操作的影响,只是传递给浏览器并按原样插入 DOM) , 但是当一个组件有一个匹配名称的@Input() 时,该属性将绑定到该属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2020-08-29
    • 1970-01-01
    • 2019-09-08
    • 2020-06-03
    • 2020-03-28
    • 2018-06-09
    相关资源
    最近更新 更多