【问题标题】:Angular2 ngfor calling method 3timesAngular2 ngfor调用方法3次
【发布时间】:2017-03-10 14:24:42
【问题描述】:

我尝试在 ngfor 中调用一个方法

*ngFor=" let day of Days()" >{{day}}

方法:

Days(){
 console.log("check");
 return [1,2,3,4,5,6,7];
}

它执行一次模板,但问题是它登录控制台 3 次“检查”。 为什么会调用这个函数3次?

模板

<div class="table-responsive">
    <table class="table table-bordered year">
        <tr>
            <td *ngFor=" let day of Days()" >{{day}}</td>
        </tr>
    </table>
</div>

控制器

export class MonthComponent{
    //public num: number;
    public lastday: number; 
    num = 1;
    Days(){
        console.log("check");
        return [1,2,3,4,5,6,7];
    }

    getDays(){

        if( this.num == 1 ){
            let j=1;
            let d = new Date();
            let day = d.getDay();
            let today = d.getDate();
            let dif = today % 7;
            let days = [];
            if( day - dif <0){
                dif = day - dif + 8;
            }
            else dif = day-dif;
            for (let i = 0; i != 7; i+=1) {
                if(i < dif-1) days.push(31-dif+i+2);
                else {
                    days.push(j);
                    j+=1;
                }
                //console.log(days);

            }
            this.lastday = j-1;
            this.num +=1;
            console.log(days);

            return days;
        }
        else{
            let j = this.lastday;
            let days = []
            for (var i = 0; i < 7;i+=1) {
                j +=1;
                days.push(j)

            }
            this.lastday = j;
            console.log(days);
            console.log(this.num);

            this.num +=1;
            return days;
        }
    }
}

Days() 是测试函数,确实需要getDays()

【问题讨论】:

  • 可以添加完整的控制器和模板代码吗?
  • @SefaÜmitOray 给你
  • 因为 angular 会自动检测变化。要知道该方法返回的数组自上次检查更改后是否发生了更改,需要调用该方法。这完全是意料之中的正常现象。
  • 我收到一个错误:“检查后表达式已更改。以前的值:'3,4,5,6,7,8,9'。当前值:'10,11,12 ,13,14,15,16'。”我可以以某种方式改变这一点还是我应该改变我的逻辑? @JBNizet
  • 您的方法总是返回相同的硬编码数组。你的真实密码是什么?更重要的是,为什么不在 ngOnInit 方法中只执行一次这段代码来初始化组件的一个字段?

标签: angular methods ngfor


【解决方案1】:

尽量避免在绑定中使用函数/方法。每次运行更改检测时,Angular2 更改检测都会执行它们。

因为每次调用都会从Days() Angular2 中返回不同的数组实例@ Angular2 更改检测会抛出“”表达式在检查后发生更改。”因为这种方式更改检测无法确定模型何时稳定,因为每次更改检测检查它是否已更改(它不检查数组的内容,只检查对象标识)

要解决将函数的结果分配给属性并在绑定中使用此属性的方法:

class MyComponent {
  constructor() {
    this.Days();
  }

  days:<number>[];

  Days(){
   console.log("check");
   this.days = [1,2,3,4,5,6,7];
  }
}
<div class="table-responsive">
    <table class="table table-bordered year">
        <tr>
            <td *ngFor=" let day of days" >{{day}}</td>
        </tr>
    </table>
</div>

【讨论】:

  • 如果是带参数的函数呢?我的意思是,“让 d 天(月)”。简单地缓存所有结果不是一个好主意
  • 您可以使用参数缓存结果,当参数更改时,然后删除缓存并重建它。从绑定中调用执行实际工作的方法或函数将严重损害您的应用程序性能。尽量避免这种情况。
  • 可能的参数可能是无限的。除非您每次知道循环结束时清除缓存,否则它不能被缓存。我认为这应该是 NgFor 指令的一个重要特性。
  • 我看不出这有什么改变。您可以保存(几乎)无限的参数列表,并比较一个是否已更改。您可以订阅参数更改并在收到通知时删除缓存。有很多方法可以做到,但从视图调用方法或函数不应该是其中之一;-)
  • 当然。删除缓存就可以了。我的情况是,视图中有很多列表。每个人都需要函数来获取不同的数组。处理缓存可能很棘手。任何方式它仍然可以完成。只是需要更多的工作。认为如果 ngFor 中的功能会更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2017-04-25
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多