Javascript 为什么angularjs摘要使用日期获取函数进入无限循环
我有一个DTO对象,它有一个日期参数。我将此Dto包装到视图模型对象中,然后在视图中将其属性绑定到标签Javascript 为什么angularjs摘要使用日期获取函数进入无限循环,javascript,angularjs,Javascript,Angularjs,我有一个DTO对象,它有一个日期参数。我将此Dto包装到视图模型对象中,然后在视图中将其属性绑定到标签 <label class="form-control">{{controller.ViewModel.Date}}</label> 发出的JavaScript: Object.defineProperty(ViewModel.prototype, "Date", { get: function () { return new Date(Date
<label class="form-control">{{controller.ViewModel.Date}}</label>
发出的JavaScript:
Object.defineProperty(ViewModel.prototype, "Date", {
get: function () {
return new Date(Date.parse(this.dto.Date));
},
enumerable: true,
configurable: true
});
我相信,因为我在getter和angular中创建了一个新的日期,所以我认为这意味着日期总是新的,它会一直获取日期,直到模型稳定下来,从而导致无限循环
为什么要这样做?为什么它一次又一次地呼叫getter,只呼叫一次又有什么不对呢?
我能告诉angular只需调用一次getter并接受给定的值吗?如果您的版本足够高,可以尝试一次性绑定。 请按照此处的说明操作: 你基本上是对的,你认为日期总是新的。您正在使用getter中的求值更改值,angular的脏检查和监视触发另一个摘要
您还可以尝试提前解析日期吗?我找到了一种解决方法,如下所示: 仅发布更具可读性的typescript:
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格式保存我的Dto日期。您使用的是哪个版本的angular?angular将连续运行摘要,直到所有观察者的结果稳定为止。在这里,每次您的观察者返回一个不同的对象,从而生成无限循环。有时,当从模板调用时,可以通过对结果使用toString()来解决这个问题。例如:
{{controller.ViewModel.Date.toString()}}
为什么不将函数的结果存储在$scope变量中,然后在HTML中使用它,而不是直接链接到函数?我尝试过像这样隐藏操作,但得到了相同的结果。public get TxDate():Date{let dtoDate=moment(this.dto.TxDate).toDate();if(this.|TxDate==undefined | | | | this.TxDate==null)this.\u TxDate=dtoDate;if(dtoDate.getFullYear()!=this.| TxDate.getFullYear()| dtoDate.getMonth()!=this.\u TxDate.getMonth())| | dtoDate.getDate()!=this.txDate.getDate(){this.txDate=dtoDate;}返回此。txDate;}
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;