2015-12-23 9 views
5

के साथ अनंत लूप में क्यों जाता है मेरे पास एक डीटीओ ऑब्जेक्ट होता है जिसमें दिनांक पैरामीटर होता है। मैं इस डीटीओ को एक दृश्य मॉडल ऑब्जेक्ट में लपेट रहा हूं, जिसके गुण मैं एक लेबल में अपने विचार में बाध्यकारी कर रहा हूं।एंजुलरजेस डाइजेस्ट डेट लेटर फ़ंक्शन

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

दृश्य मॉडल में मेरे पास एक गेटर है। (टाइपप्रति मैं उपयोग कर रहा हूँ)

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

उत्सर्जित जावास्क्रिप्ट:

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

मेरा मानना ​​है कि कारण है क्योंकि मैं गेटर में एक नई तिथि बनाने रहा हूँ और कोणीय सोचता है कि इसका मतलब है कि कि दिनांक हमेशा नए हैं और यह तब तक तारीख प्राप्त करता रहता है जब तक कि मॉडल स्थिर न हो जाए, इस प्रकार एक अनंत लूप उत्पन्न होता है।

कोणीय ऐसा क्यों कर रहा है?
यह गेटटर को बार-बार क्यों कॉल करता रहता है, बस इसे एक बार कॉल करने में क्या गलत है?
क्या मैं एक बार गेटर को कॉल करने के लिए कोणीय बता सकता हूं और इसे दिया गया मान स्वीकार कर सकता हूं?

+0

कोणीय का कौन सा संस्करण आप उपयोग कर रहे हैं? – SpykeBytes

+0

कोणीय सभी जांचकर्ताओं के परिणाम तक लगातार पाचन चलाएंगे। यहां, प्रत्येक बार जब आपका वॉचर एक अलग ऑब्जेक्ट देता है, इस प्रकार अनंत लूप उत्पन्न करता है। कभी-कभी आप टेम्पलेट से कॉल करते समय परिणाम पर toString() का उपयोग करके इसे प्राप्त कर सकते हैं। पूर्व: '{{नियंत्रक .ViewModel.Date.toString()}} – BiAiB

+2

आप फ़ंक्शन का परिणाम $ स्कोप वैरिएबल में क्यों संग्रहीत नहीं करते हैं और उसके बाद HTML में इसका उपयोग सीधे –

उत्तर

2

यदि आप एक उच्च पर्याप्त संस्करण पर हैं, तो आप एक बार बाध्यकारी कोशिश कर सकते हैं। यहां दिए गए निर्देशों का पालन करें: https://docs.angularjs.org/guide/expression#one-time-binding

आप मूल रूप से अपनी धारणा के साथ सही हैं कि कोणीय सोचता है कि तिथियां हमेशा नई होती हैं। आप अपने गेटटर में मूल्यांकन के साथ मूल्य बदल रहे हैं और कोणीय की गंदे जांच और घड़ियों एक और पाचन ट्रिगर करता है।

क्या आप समय से पहले तारीख को पार्स करने का भी प्रयास कर सकते हैं?

केवल टाइपप्रति पोस्टिंग के रूप में इसे और अधिक पठनीय है:

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; 

यह मैं देने के लिए मैं क्या जरूरत है प्रकट होता है

+0

से लिंक करने के बजाय करते हैं मैंने इस तरह के कोणीय से अपने परिचालन छिपाने की कोशिश की लेकिन मुझे एक ही परिणाम मिल गया। जनता को टीएक्सडेट() प्राप्त करें: दिनांक { dtoDate = moment (this.dto.TxDate) .toDate(); अगर (this._txDate === अपरिभाषित || this._txDate === शून्य) यह ._txDate = dtoDate; अगर (dtoDate.getFullYear()! = This._txDate.getFullYear() || dtoDate.getMonth()! = This._txDate.getMonth() || dtoDate.getDate()! = This._txDate.getDate()) { this._txDate = dtoDate; } इसे वापस करें ._txDate; } – John

2

मैं एक तरह से इस दौर के रूप में निम्नानुसार पाया। डिस्प्ले दिनांक एक दृश्य लेबल से जुड़ा हुआ है ताकि मैं डिस्प्ले प्रारूप प्राप्त कर सकूं और टीएक्सडेट एक छिपे हुए फॉर्म डेट-पिकर कंट्रोल से जुड़ा हुआ है, इस तरह यह सब काम करता है। और मैं अपनी डीटीओ तिथि ISO8601 प्रारूप में रख सकता हूं।

संबंधित मुद्दे