W moim XML dla obiektu listy korzystam z formattera:

{path: 'Erdat', formatter: '.formatter.dateFormatter'}

Działa to zgodnie z oczekiwaniami i widzę wartość związanej dla Erdat przeszedł do dateFormatter, a następnie odpowiednio sformatowany. Jednak w mojej aplikacji mam możliwość ponownego wywołania usługi bramy tylnej bramy, która ponownie wiąże nowo pobierane dane do listy (listLogs):

oActLogs.read("/ActivityLogsSet", {
  success: function (oData, oResponse){
    oActivityLogsModel.setData(oData);
    listLogs.setModel(oActivityLogsModel);
    oGlobalBusyDialog.close();
  },
  // ...
});

Działa to i widzę nowe dane są pobierane z usługi. Jednakże, gdy ustawię ten nowy model do listLogs Formatter jest trafiony, ale tym razem jest przekazywany null, a następnie zawiesza się, gdy formated próbuje zrobić wszystko z tą wartością.

Debugował mnie i widziałem, że na tym drugim połączeniem, które pobierane dane nie jest null, więc dlaczego nie jest przekazywany do formatury?

2
Joe 20 luty 2019, 16:54

2 odpowiedzi

Najlepsza odpowiedź

Gdybym musiał zgadnąć, powiedziałbym, że każda zmiana wiązania spowoduje wyzwolenie formatę. To może być również "rozpinane", zanim wiążysz nowy model. Albo wiążysz nowy model przed załadowaniem danych.

Dlaczego nie po prostu zrobić coś takiego w formatorze:

dateFormatter: function(oValue) {
  if (!oValue) {
    return "";
  }
  // do the real stuff
}

Dobrą praktyką, aby Twój formated zwrócił coś przydatnego (przynajmniej pusty ciąg), nawet jeśli wejścia są gówniane, które mogą łatwo zdarzyć z różnych powodów (model jeszcze nie istnieje, dane jeszcze nie załadowane, ...). Zapobiegnie to twojemu interfejsu użytkownika pokazuje brzydkie rzeczy, takie jak "nieokreślony".

BTW: Czy uważasz za pomocą Typy dla formatowania daty?

Bris.

2
Boghyon Hoffmann 20 luty 2019, 22:52

I (...) ponownie wiążą nowo pobierane dane do listy.

oActLogs.read("/ActivityLogsSet", {
  success: function (oData, oResponse){
    oActivityLogsModel.setData(oData);
    listLogs.setModel(oActivityLogsModel);
    oGlobalBusyDialog.close();
  },
  // ...
});

Może w ogóle nie jest wymagane, zakładając, że możliwe jest wiązanie ActivityLogsSet bezpośrednio do listy. Następnie możesz zadzwonić {{ X1}} Od Odatalistbinding.

Przykład

<List id="listLogs" items="{/ActivityLogsSet}"> <!-- in place of oActLogs.read() -->

(Wiązanie agregacji dba o wysyłanie żądań i ustawiania danych do listy.)

Potem gdzieś w kontrolerze:

onRefreshButtonPress: function() {
  this.byId("listLogs").getBinding("items")/*ODataListBinding*/.refresh();
},

Po wysyła wiązanie nowego żądania ({x0}}), formated zostanie wyzwolony, gdy dane są odbierane, ale z odpowiednią wartością zamiast null od samego początku.


{path: 'Erdat', formatter: '.formatter.dateFormatter'}

Możesz nawet nie potrzebować niestandardowego dateFormatter. Zobacz Jak dodać datę / Czas z usługi Odata poprawnie do interfejsu użytkownika?

0
Boghyon Hoffmann 20 luty 2019, 23:52