2015-12-23 11 views
5

Mam obiekt DTO, który ma parametr Date. Zawijam to DTO w obiekt modelu widoku, którego właściwości następnie wiążę moim zdaniem do etykiety.Dlaczego angularjs Digest przechodzi w nieskończoną pętlę z funkcją getter daty

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

W modelu widokowym otrzymałem zatem narzędzie pobierające. (Używam maszynopis)

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

emitowane JavaScript:

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

wierzę, że powodem, ponieważ tworzę nową datę w getter i kanciasty uważa, że ​​oznacza to, że terminy są zawsze nowe i ciągle dostaje datę, aż model się ustabilizuje, powodując nieskończoną pętlę.

Dlaczego to robi?
Dlaczego ciągle dzwoni do gettera, co jest złego w tym, że dzwonisz tylko raz?
Czy mogę powiedzieć, kanciasty, aby po prostu zadzwonić do gettera i zaakceptować wartość, która jest podana?

+0

Z jakiej wersji kątowej korzystasz? – SpykeBytes

+0

kątowa będzie przeprowadzać kolejne trawienia do momentu ustabilizowania wyniku wszystkich obserwatorów. Tutaj za każdym razem, gdy obserwator zwraca inny obiekt, generuje nieskończoną pętlę. Czasami można obejść to, używając toString() na wyniku, gdy zostanie wywołany z szablonu. Np .: '{{controller.ViewModel.Date.toString()}}' – BiAiB

+2

Dlaczego nie przechowujesz wyniku funkcji w zmiennej $ scope, a następnie użyjesz go w HTML zamiast bezpośredniego połączenia z funkcją –

Odpowiedz

2

Jeśli masz wystarczająco wysoką wersję, możesz spróbować jednorazowego wiązania. Postępuj zgodnie z instrukcjami:

Masz zasadniczo rację, przyjmując założenie, że kątowe uważa, że ​​daty są zawsze nowe. Zmieniasz wartość z oceną w geterze i nieczytelnym sprawdzeniem kątowym, a zegarki uruchamiają kolejny skrót.

Czy mógłbyś również sparsować datę przed czasem?

+0

Próbowałem ukryć operacje w taki sposób, ale otrzymałem taki sam wynik. public get TxDate(): Data { let dtoDate = moment (this.dto.TxDate) .toDate(); if (this._txDate === undefined || this.txDate === null) this._txDate = dtoDate; if (dtoDate.getFullYear()! = This._txDate.getFullYear() || dtoDate.getMonth()! = This._txDate.getMonth() || dtoDate.getDate()! = This._txDate.getDate()) { this.txDate = dtoDate; } return this._txDate; } – John

2

znalazłem okrągły ten sposób następująco:

Piszesz tylko maszynopis, ponieważ jest bardziej czytelny:

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; 

wydaje się dać mi to czego potrzebuję. Data wyświetlana jest powiązana z widoczną etykietą, dzięki czemu mogę uzyskać żądany format wyświetlania, a TxDate jest związany z ukrytą formą kontrolera wyboru daty. W ten sposób wszystko działa. I mogę zachować datę DTO w formacie ISO8601.

Powiązane problemy