Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.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 角度5:ngFor仅在第二次单击按钮时有效_Javascript_Angular_Angular5 - Fatal编程技术网

Javascript 角度5:ngFor仅在第二次单击按钮时有效

Javascript 角度5:ngFor仅在第二次单击按钮时有效,javascript,angular,angular5,Javascript,Angular,Angular5,我的设想如下 1当用户在文本字段中输入关键字并单击搜索图标时,它将启动HTTP请求以获取数据 2使用ngFor以HTML格式呈现数据 问题是在第一次单击时,数据没有以HTML呈现,但我得到了正确的HTTP响应,并且数据仅在第二次单击时呈现 组件技术 // CHANGE import { Observable } from 'rxjs/Observable'; // MISSING IMPORT import { of } from 'rxjs/observable/of'; export cl

我的设想如下

1当用户在文本字段中输入关键字并单击搜索图标时,它将启动HTTP请求以获取数据

2使用ngFor以HTML格式呈现数据

问题是在第一次单击时,数据没有以HTML呈现,但我得到了正确的HTTP响应,并且数据仅在第二次单击时呈现

组件技术

// CHANGE
import { Observable } from 'rxjs/Observable';
// MISSING IMPORT
import { of } from 'rxjs/observable/of';

export class CommerceComponent implements OnInit {
    // CHANGE
    private dealList: Observable<any[]>; // you should replace any with your object type, eg. string, User or whatever

    //trigger on search icon click
    startSearch() {
       //http service call
        this.getDeals();
    }

    getDeals() {
        this.gatewayService.searchDeals(this.searchParams).subscribe(
            (data:any)=>{
                // CHANGE
                this.dealList = of(data.result);
                console.log("Deal list",this.dealList);
            },
            (error)=>{
                console.log("Error getting deal list",error);
                // CHANGE
                this.dealList = of([]);
                alert('No deals found');
            }
        );
    }
}
服务台

HTML

更新

单击“绑定html代码”

 <div class="search-input">
          <input type="text" [(ngModel)]="searchParams.keyword" class="search" placeholder="" autofocus>
          <div class="search-icon" (click)="startSearch()">
            <img src="assets/images/search.png">
          </div>
        </div>
试试这个:

this.dealList = Object.assign({},data.result);
最好在服务内部这样做

默认情况下,角度引擎仅在识别数据更改时渲染视图。

根据,如果将私有属性绑定到模板,则可能会出现问题:

角度仅绑定到公共组件属性


将属性dealList设置为public可能会解决此问题。

从dealList变量中删除private。该声明使组件变量仅在编译时可用


另一个问题:您正在yout组件中实现OnInit,但没有使用ngOnInit。在这种情况下,Angular会抛出错误。

我的建议是切换到observable:

我用零钱标记我的变化

组件技术

// CHANGE
import { Observable } from 'rxjs/Observable';
// MISSING IMPORT
import { of } from 'rxjs/observable/of';

export class CommerceComponent implements OnInit {
    // CHANGE
    private dealList: Observable<any[]>; // you should replace any with your object type, eg. string, User or whatever

    //trigger on search icon click
    startSearch() {
       //http service call
        this.getDeals();
    }

    getDeals() {
        this.gatewayService.searchDeals(this.searchParams).subscribe(
            (data:any)=>{
                // CHANGE
                this.dealList = of(data.result);
                console.log("Deal list",this.dealList);
            },
            (error)=>{
                console.log("Error getting deal list",error);
                // CHANGE
                this.dealList = of([]);
                alert('No deals found');
            }
        );
    }
}
HTML


在第一次单击中记录this.dealList时,在将“click”事件绑定到StartSearch函数的位置发布代码。结果如何?@Thangadurai更新了我的问题您是否看到console.logDeal列表。。。在第一个按钮上单击?我在我的一个angular项目中尝试过它,但有趣的是,它工作得很好。@fatemefazli它将在第一次点击上帝答案时记录结果,但我在我的一个angular项目中尝试了大部分历史代码片段,它与private一起工作。我也很惊讶:-取决于你的角度版本,如果你默认使用AOT编译,你可能会遇到麻烦。我们需要复制这个bug来更好地理解它。使用这个“public dealList=[];”但是仍然是同样的问题我没有测试就写了这段代码,如果它不能正确编译或工作,请告诉我&我会修复它-我遇到了另一个语法分析器错误:意外的令牌,最后它与此let deal-deal-list | async一起工作,但我遇到了相同的问题:
this.dealList = Object.assign({},data.result);
// CHANGE
import { Observable } from 'rxjs/Observable';
// MISSING IMPORT
import { of } from 'rxjs/observable/of';

export class CommerceComponent implements OnInit {
    // CHANGE
    private dealList: Observable<any[]>; // you should replace any with your object type, eg. string, User or whatever

    //trigger on search icon click
    startSearch() {
       //http service call
        this.getDeals();
    }

    getDeals() {
        this.gatewayService.searchDeals(this.searchParams).subscribe(
            (data:any)=>{
                // CHANGE
                this.dealList = of(data.result);
                console.log("Deal list",this.dealList);
            },
            (error)=>{
                console.log("Error getting deal list",error);
                // CHANGE
                this.dealList = of([]);
                alert('No deals found');
            }
        );
    }
}
<!-- CHANGE -->
<div class="deal1"  *ngFor="let (deal | async) of dealList">
    {{deal}}
</div>