2013-09-07 7 views
6

Próbuję wyświetlić 3 projekty w rzędzie. Mój szablon wygląda tak: (AKTUALIZACJA)Jak zapełnić system siatki startowej za pomocą kierownicy dla każdego polecenia w Meteor.js?

<template name="projectList"> 
    {{breakTimeReset}} 
    <div class=row>   
    {{#each projects}} 

    {{> projectItem}} 

     {{#if breakTime}} 
     </div> 
     <div class=row> 
     {{/if}} 

    {{/each}} 
    </div> 
</template> 

Jak widać dla każdego projektu na wyjściu bazie I projectItem. Chcę wyjście je tak co 3 projektu są owinięte w

To jest mój js pomocnik

Template.projectList.helpers({ 
    projects: function() { 
     return Projects.find(); 
    }, 
    breakTimeReset: function() { 
     Template.projectList.doCount = 0; 
    }, 
    breakTime: function() { 
     count = Template.projectList.doCount + 1; 
     console.log(count); 
     Template.projectList.doCount = count; 

     if (count % 3 == 0) { 
      console.log("Started break"); 
      return true; 
     } 
     else 
      return false; 
    } 
}); 

Moje pytanie brzmi: w jaki sposób mogę ustawić go tak, tam są 3 projekty w rzędzie, a następnie wie wstawić nowy wiersz div po każdych 3 projektach? Sposób, w jaki mam to ustawienie, prowadzi do naprawdę ostrych wyników, ponieważ nie jest niezawodny, ponieważ nowy element div zostanie wstawiony przed projektem.

Sprawdź tutaj wyników: http://testprojectapp.meteor.com

Przekonasz się, że pierwszy wiersz pojawia się ok, ale potem trochę funkowe rezultaty po tym. A jeśli przejrzysz katalog DOM przez stronę przeglądania, zobaczysz, że nie pasuje do mojego kodu, który jest dziwny.

Daj mi znać, jeśli jest to mylące pytanie. Dzięki!

+0

Ktoś wie? :) – nearpoint

Odpowiedz

7

Twoje dane mogą grupa przed pobiera renderowane:

Template.projectList.helpers({ 
    projects: function() { 
     all = Projects.find({}).fetch(); 
     chunks = []; 
     size = 3 
     while (all.length > 3) { 
      chunks.push({ row: all.slice(0, 3)}); 
      all = all.slice(3); 
     } 
     chunks.push({row: all}); 
     return chunks; 
    }, 
    breakTimeReset: function() { 
     Template.projectList.doCount = 0; 
    }, 
    breakTime: function() { 
     count = Template.projectList.doCount + 1; 
     console.log(count); 
     Template.projectList.doCount = count; 

     if (count % 3 == 0) 
      return "</div><!-- why? --><div class='row'>" 
     else 
      return "" 
    } 
}); 

<template name="projectList"> 
    {{breakTimeReset}} 
    {{#each projects}} 
    {{> projectRow }} 
    {{/each}} 
</template> 

<template name='projectRow'> 
    <div class='row span12'> 
    {{#each row }} 
     {{> projectItem}} 
    {{/each}} 
    </div> 
</template> 

<template name="projectItem"> 
    <div class="span4"> 
    <h3><a href="{{projectPagePath this}}"> {{title}} </a></h3> 
    <p> {{subtitle}} </p> 
    <p> {{description}} </p> 
    <p><img src="{{image}}"/></p> 
    <p> {{openPositions}} </p> 
    </div> 
</template> 

Niestety brakowało mi tak wiele razy, nearpoint!

+0

To jest piękne dla moich oczu! Działa jak magia. Wielkie dzięki za rozwiązanie! Właśnie skończyłeś moją noc, teraz mogę spać spokojnie. Zawdzięczam ci jedno :) – nearpoint

+0

To jest szalone, jak kierownice renderują szablon. Byłoby miło, gdyby było polecenie wyłączenia tego. – nearpoint

+0

Jestem w ten sam sposób; miło, że mogłem pomóc –

0

AKTUALIZACJA: nie powiodło się, ponieważ silnik szablonów jest pomocny i nie pozwala na umieszczanie tagów obejmujących szablony. Równoważy każdy z nich, nawet jeśli spróbujesz po prostu wstrzyknąć tekst. Miło, jeśli tego potrzebujesz, nie jestem fanem.

Poprzedni:

Och, nearpoint przyklejone do swoich pistoletów i myliłem! Handlebars analizuje każdy szablon i "naprawia" go tak, że istnieje parzysta liczba tagów. Edytowane w celu odzwierciedlenia tego.

Szablon

<template name='sureties'> 
{{breakTimeReset}} 

{{#each allSureties }} 

    {{name}} 

    {{{breakTime}}} 

{{/each}} 
</template> 

Niektóre funkcje pomocnicze

Template.sureties.breakTimeReset = -> 
    Template.sureties.docCount = 0 
    '' 
Template.sureties.breakTime = -> 
    count = Template.sureties.docCount + 1 or 0 
    console.log count 
    Template.sureties.docCount = count 
    if count % 3 is 0 
    return "</div><div class=""> 
    else 
    return "" 
+0

Próbowałem czegoś takiego i nie mogę go uruchomić. Zaktualizowałem powyższy kod o to, co próbowałem zrobić. – nearpoint

+0

Spróbuj, jeśli ((count! = 0) && (count% 3 == 2)) { , ale masz problem z zamknięciem go poprawnie (bez podwójnego zamykania). Dlatego wolę myśleć o przełomie jako zamknięciu i otwarciu. Jeśli skończysz z pustym wierszem, nie ma problemu. Mój kod działa tak jak jest, ma tylko dwie funkcje. rozważ to. –

+0

Mam wątpliwości co do niektórych rzeczy w twoim szablonie. Zakładam, że zmienna {{name}} w twoim kodzie jest odpowiednikiem projektu w moim. Po pierwsze, pierwsze {{name}} nie dostaje się do , ponieważ wywołuje się je tylko po. Po drugie, co masz na myśli przez count = Template.sureties.docCount + 1 lub 0. Dlaczego część "lub 0"? Na koniec, czy masz na myśli, że jeśli policzymy% 3 to 0, zwrot jest prawdziwy? Dzięki, naprawdę doceniam twoją pomoc, jestem blisko, czuję! – nearpoint

2

Możesz to również zrobić, używając zwykłego CSS. Framework Foundation ma system gridowy, w którym musisz zdefiniować kolumny w elemencie siatki, a nie w elementach potomnych, a ktoś go zaadaptował do użycia razem z bootstrapem. Oznacza to, że możesz po prostu dodać coraz więcej elementów, a siatka je rozmieści.

https://github.com/JohnnyTheTank/bootstrap-block-grid

<div class="block-grid-xs-2 block-grid-sm-3 block-grid-md-4"> 
    <div> 
     Content 1 
    </div> 
    <div> 
     Content 2 
    </div> 
    <div> 
     Content 3 
    </div> 
    <div> 
     Content 4 
    </div> 
    <div> 
     Content 5 
    </div> 
    <div> 
     Content 6 
    </div> 
</div> 
Powiązane problemy