Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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 为什么angularjs摘要使用日期获取函数进入无限循环_Javascript_Angularjs - Fatal编程技术网

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

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

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

<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;