2014-12-11 5 views
5

Mam następujące ustawienie wyświetlania moje zamówienie wg daty: orders by dayember.js komputerowa nie aktualizuje pozycję hasMany po sortowaniu

Mam następujący szablon, który pokazuje każde zamówienie dla danego tygodnia: (I odpędza niektóre html dla zwięzłość)

Szablon:

{{#each ordersByDate in ordersByDateOfWeek}} 
    <div class="orders-by-date"> 
     <div> 
      <span>{{order-date-formatted ordersByDate.date}}</span> 
     </div> 

     {{#each order in ordersByDate.orders}} 
      {{order.number}} {{! updates correctly}} 
      {{order.market.name}} {{! a hasmany property called here, does not update}} 
     {{/each}} 
    </div> 
{{/each} 

obliczane nieruchomość:

ordersByDateOfWeek: function() { 

    var result = []; // return value 
    var object = null 
    var date = null; 


    // add every order to an array with a date an order objects 
    this.forEach(function (order) { 

     // get the date of the order 
     date = order.get('created'); 

     // create a new object that holds the orders for a given date 
     object = result.findProperty('date', date); 

     // create the object if it does not exist 
     if (!object) { 
      object = { 
       date: date, 
       orders: [], 
       // some more 
      }; 

      // add the object with the date to the result 
      result.push(object); 
     } 

     // add the orders to the current object 
     object.orders.push(order); 

     // more calculations done here below 
    }); 
}.property('model', 'sortProperties', 'sortAscending'), 

Co robi jest, że tworzy tablicę obiektów tak:

[ 
    { 
    "date":"2014-12-08", 
    "orders":[// order objects here], 
    // some more properties 
    }, 
    { 
    "date":"2014-11-08", 
    "orders":[], 
    }, 
    { 
    "date":"2014-10-08", 
    "orders":[], 
    }, 
] 

próbuję przez kilka godzin teraz, i nie może uzyskać moja głowa wokół niego, aby zmusić go do pracy. Moja intuicja mówi, że ma to związek z obietnicami? Ale w tablicy "orders: []" są prawdziwe obiekty Embera, więc powinno to działać, jak sądzę.

Mam nadzieję, że ktoś może wskazać mi właściwy kierunek.

Wielkie dzięki chłopaki!

Edycja: aby być w 100% przejrzystym: mój model zamówienia składa się wyłącznie z zamówień. Ten niestandardowy obiekt sam się tworzę. Dlatego myślę, że wiązanie danych się zepsuło.

+0

Czy wypisałeś 'Ember.computed.sort'? Istnieje również standardowa właściwość 'arranContent', która jest używana jako wynik sortowania, jeśli szukasz tego typu rzeczy. – aceofspades

+0

Witam, jestem trochę spóźniony, ale dziękuję za odpowiedź! Jednak nie widzę, jak to zadziała, ponieważ 'arranContent' jest również używany dla' sortProperties', którego już używam. Zobacz: http://emberjs.com/api/classes/Ember.ArrayController.html#property_arrangedContent Czy muszę napisać własną 'arranContent' z własną kompilacją sortowania? Jeśli podasz przykład w odpowiedzi, zaakceptuję go jako taki. – DelphiLynx

+0

Po wielu dniach błądzenia z nim robię nagrodę. Nie mogę dostać się tam, gdzie chcę, ponieważ uporządkowane treści nie mają możliwości ustalenia daty przed oryginalnymi przedmiotami. – DelphiLynx

Odpowiedz

5

Problemem jest to, że szablon aktualizuje się tylko wtedy, gdy ordersByDateOfWeek aktualizacje. Co się dzieje, gdy zmieni się którykolwiek z obserwowanych właściwości ('model', 'sortProperties', 'sortAscending'). Kiedy samodzielnie budujesz obiekty porządkowe, pod maską ember doda je tak, jak chcesz, ale nie spowodują one aktualizacji i dlatego Twój szablon nie rozpozna zmiany.

Najprostszym rozwiązaniem byłoby pracować z rzeczywistymi właściwościami (tj modeli swoich zamówień) i dodać je '[email protected]' do ordersByDateOfWeek s liście obserwacyjnej. Jeśli potrzebujesz dodatkowych pól, takich jak date utworzyć je jako obliczonych właściwości modelu, tak jak poniżej:

date: Ember.computed.alias('created') 

Należy rzadko potrzebne do tworzenia obiektów ręcznie.

+0

Dziękuję za odpowiedź. Trochę za późno, ale ostatnio nie byłem w projekcie. Twoja odpowiedź załatwiła sprawę, zmieniłem listę obserwowanych właściwości i dodałem 'model. @ Each'. (w moim przypadku zamówienia nie są "ma-wiele") – DelphiLynx

2

Obliczone właściwości nie są magiczne ;-) Są świetne, ale nie magiczne.

Podejrzewam, że ponieważ użytkownik nasłuchuje zmian 'model', nie uruchamia aktualizacji po zmianie właściwości zagnieżdżonych w tym obiekcie. Twoja własność zostanie ponownie oceniona dopiero po zmianie obiektu referencyjnego 'model'.

W takim przypadku potrzebujesz co najmniej '[email protected]', jeśli faktycznie przypiszesz nową tablicę do swoich obiektów. Jeśli po prostu zmienisz tablicę, dodając więcej obiektów później, potrzebujesz rozwiązania dwuetapowego. W takim przypadku napisz komentarz, a ja poszerzę swoją odpowiedź.

do odczytu: http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/

+0

Muszę dodać, że mój model składa się wyłącznie z zamówień. Ta niestandardowa data, którą przedstawiam, to moja własna implementacja, która pokazuje dane widoczne na obrazku. (Dodam te informacje również do pytania) – DelphiLynx