为什么angularjs摘要使用日期获取函数进入无限循环

Why does angularjs Digest go into infinite loop with date getter function

本文关键字:函数 获取 无限循环 日期 angularjs 为什么      更新时间:2023-09-26

我有一个DTO对象,它有一个Date参数。我将这个Dto包装在视图模型对象中,然后在视图中将其属性绑定到标签。

<label class="form-control">{{controller.ViewModel.Date}}</label>

在视图模型中,我有一个getter。(我使用的是TypeScript)

public get Date(): Date {
    return new Date(Date.parse(this.dto.Date));
    //return moment(this.dto.Date).toDate();
}

发出的JavaScript:

Object.defineProperty(ViewModel.prototype, "Date", {
    get: function () {
        return new Date(Date.parse(this.dto.Date));
    },
    enumerable: true,
    configurable: true
});

我相信,因为我在getter和angular中创建了一个新的Date,所以我认为这意味着日期总是新的,它会一直获取日期,直到模型稳定下来,从而导致无限循环。

angular为什么要这么做
为什么它不断地调用getter,只调用一次有什么错
我能告诉angular只调用getter一次并接受它给出的值吗?

如果您的版本足够高,可以尝试一次性绑定。请按照此处的说明进行操作:https://docs.angularjs.org/guide/expression#one-时间绑定

你基本上是对的,你认为angular认为日期总是新的。您正在更改getter中的评估值,angular的脏检查和监视会触发另一个摘要。

你能不能试着提前分析一下日期?

我找到了一种方法,如下所示:

只张贴打字稿,因为它更可读:

 public DisplayDate: string = new Date(Date.parse(this.dto.TxDate)).toLocaleDateString();
    public get TxDate(): Date {
        let txDate = new Date(Date.parse(this.dto.TxDate));
        if (this._txDate === null && this._txDate != txDate)
            this._txDate = txDate;
        return this._txDate;
    }
    public set TxDate(value: Date) {
        this.dto.TxDate = value.toISOString();
        this._txDate = value;
        this.DisplayDate = this._txDate.toLocaleDateString();
    }
    private _txDate: Date = null;

这似乎给了我所需要的。显示日期被绑定到一个可见的标签,这样我就可以获得我想要的显示格式,TxDate被绑定到隐藏的表单日期选择器控件。我可以用ISO8601格式保存我的Dtodate。