• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    KOMKnockout.js

    Knockout is a JavaScript library that helps you to create rich, responsive display and editor user interfaces with a clean underlying data model. Any time you have sections of UI that update dynamically (e.g., changing depending on the user’s actions or when an external data source changes), KO can help you implement it more simply and maintainably.

    24510
    rozbalit záhlaví
    RAPTORCZ
    RAPTORCZ --- ---
    JULIEEHARSHAW: No ono je to právě ještě trošku složitější. Mám hodně sdílených knihoven, každý má svoje resource a DB slouží ještě navíc jako override resx souborů. Čili nejsem si moc jistý, že jsem vůbec schopen vygenerovat všechny resourcy tak jak jsou aktuální. Navíc kdykoliv se může DB změnit a tedy vygenerovaný JS už by byl nevalidní. Ale je pravda, že bych samozřejmě nerad generoval zbytečné requesty na server jen kvůli lokalizaci.
    RAPTORCZ
    RAPTORCZ --- ---
    JULIEEHARSHAW: Brání - logika. Resourců ma aplikace tisíce, další resourcy jsou na straně databáze. A i kdyby při buildu všechno vyjelo do JS tak je nesmysl tahat na klienta stringy, které nepotřebuje. Pohrávám si s nějakou myšlenkou, že prostě viewmode bude na sobě mít deklarovanou kolekci resourců co používá a při vytvoření si prostě přes svc dotáhne překlady jen toho, co je třeba. Ale zase si říkám, zda už někdo nemá vymyšlené něco jiného a jinak. Hledám prostě inspiraci. Ono pak třeba bude nutno ty resourcy nějak klientsky cachovat atd.
    RAPTORCZ
    RAPTORCZ --- ---
    Asi se to nevztahuje až tak úplně jen na KO, ale nějaký tip jak řešit lokalizaci UI? Základ bohužel je ten, že veškeré resources mi musí vracet server (Web API), nebo se musí generovat přímo do page jako nějaký dictionary. Texty jsou totiž v DB a v klasických resx souborech. Nemůže to být externí js soubor. Marně přemýšlím, jak to udělat efektivně. Nemám ani tak problém s bindingem na formu, ale jak tam dostat ty lokalizace (podle daného view modelu atd.)
    RAPTORCZ
    RAPTORCZ --- ---
    KOM: No pokud se nepletu, tak $data konkrétní mám položku ContractAction té kolekce, $parent obsahovalo právě tu kolekci přes kterou jel foreach a tedy až $root obsahuje viewmodel. Ale spíše mě překvapilo, že v tom callbacku vlastně nemám přístup ke viewmodelu. A nebo je to jen tím, že vše dělám v TypeScriptu. Přímo v JS se to nějak možná pomocí self/this proměnných dá nahackovat.
    KOM
    KOM --- ---
    RAPTORCZ: Ja vždy používám $parent misto $root. A nikdy jsem se s tímto problémem nesetkal.

    Btw. "foreach: contactActions()" by mělo házet error, ale knockout je benevolentní. Každopádně "contactActions" bys nemel volat. Je to pole...
    RAPTORCZ
    RAPTORCZ --- ---
    Tak asi to mám, nevím zda je to ok. Prostě si předám root ve kterém je hlavní view model. Je to tak ok?

    data-bind="click: $root.ContractActionClicked.bind($data, $root)"
    RAPTORCZ
    RAPTORCZ --- ---
    pro info, mám tam asi něco takovéto

    <ul class="dropdown-menu" data-bind="foreach: ContractActions()">
    <li><a href="#" data-bind="click: $root.ContractActionClicked"><span class="icon-link"></span> <!--ko text: Name--><!--/ko--></a></li>
    </ul>
    RAPTORCZ
    RAPTORCZ --- ---
    Hmm, narazil jsem na problém. Mám click handler, který prostě spustí funkcni na view modelu. Jako parametr se tam krome eventu předávají data (v tomto případě ty spojene s položkou, na kterou bylo kliknuto - pohoda). Ale poté, co se vyvolá tento callback, tak potřebuju z té cílové callback funkce zavolat jinou funkci na stejném view modelu. A to nejde. Nejsem už v tom view modelu. Jak to teda udělám? Proč se mi v this vrací stejný objekt jako je parametr? Jede to jako nějaký deffered object, nebo jaké je řešení?
    KOM
    KOM --- ---
    RAPTORCZ: Pokusim se ti neco vyzobat, myslim ze mam nekde ulozeny takovy "boilerplate"...
    RAPTORCZ
    RAPTORCZ --- ---
    KOM: Nemáš někde nějakou ukázku použití/článek o tom? RequireJS ani AMD atd. jsem nikdy nepoužíval. Potřebuju teď prostě jen do ViewModelu nějak nadefinovat, jakou si to má načíst šablonu a nechci ji mít ve stránce. Už jich je moc :-)
    KOM
    KOM --- ---
    KEDRIGERN: Nevim zda tomu rozumim spravne problemu, ale pokud zmenis u druhyho inputu binding z "attr: checked" na "checked", tak to asi dela to co ma delat ne? http://jsfiddle.net/epn4qgbt/2/
    KEDRIGERN
    KEDRIGERN --- ---
    KEDRIGERN: Zde jsem extrahoval problém: http://jsfiddle.net/keddie/epn4qgbt/ Teď chci, aby byl vždy zaškrtnut jeden řádek. Klíká se na druhý sloupec (abych tam pak mohl dobře použít i zaškrtnutí intervalu).

    Budu rád za rady, jak vyřešit. Když v console změním hodnotu observable, tak se vše provede dobře. Když to jde přes click event, tak zůstane původní zaškrtnut.
    KEDRIGERN
    KEDRIGERN --- ---
    KOM: Trochu jsem si s tím pohrál. Výsledek je zde: http://jsfiddle.net/keddie/22e4h9wo/
    Na klik bez klávesy to zaškrtává vždy jeden řádek, na shift interval. Nicméně u kliku bez klávesy mám problém s tím, že se mi neodškrtává checkbox. Hodnota je v pořádku, ale checkbox zůstane zaškrtnutý. Přitom z console, když dám $data.isSelected(false), tak to funguje správně.
    KOM
    KOM --- ---
    RAPTORCZ: Ja pouzivam Require.js a Require Text modul. Mam HTML sablonu zvlast a injectuju ji pomoci JS do DOMu.
    RAPTORCZ
    RAPTORCZ --- ---
    Jaké používáte template systémy, pro případné načtení template z externího souboru? Zatím mám vše v jednom souboru, ale občas uvažuju, že bych je raději měl bokem, kvůli rychlejší aktualizaci.
    KOM
    KOM --- ---
    KEDRIGERN:

    Precetl jsem si znova co presne potrebujes, sorry. Pokud ti jde o to pouzit SHIFT a oznacovat intervaly, tak bych asi nabindoval nejakou metodu na kazdy checkbox, ktera by toto resila, treba nejak takhle...

     function handleSelection (data, event) {
      if (event.shiftKey) {
        // check jestli uz je neco vybrano
       lastChecked = null;
       items.forEach(function (item) {
        // pokud neco checknu, ulozim si index
       });
    
       if (lastChecked) {
         // od posledniho oznacenyho az po ten na ktery jsem kliknul, vse oznacim
       } else {
         // oznacim tento checkbox
         data.isChecked(true);
       }
    
      } else {
        // oznacim tento checkbox
        data.isChecked(true);
      }
    } 
    
    KEDRIGERN
    KEDRIGERN --- ---
    KOM: Ale já chci intervaly, ne jen všechny. A navíc ještě intervaly např. od 5. do 10. elemnentu (dle posledního a aktuálního kliknutí).

    Něco jako tohle: http://rmariuzzo.github.io/checkboxes.js/#range-selection-of-checkboxes

    Akorát když to dělám přes JQuery, tak se to bije s knockout modelem. Možná by to šlo nějak chytře zkombinovat. Nevím. Kdykoliv něco napíši, tak se mi ten kód nelíbí a funkcionalita také není stoprocentní.
    KOM
    KOM --- ---
    KEDRIGERN:

    Pokud mas objekty v poli, tak to jde poresit nejak takto.

    Template:
    <button data-bind="click: checkAll">Check all</button>
    <!-- ko foreach: items -->
    <input type="checkbox" data-bind="checked: isChecked">
    <!-- /ko -->
    


    VM:
    var items = ko.observableArray([{id: 1, isChecked: ko.observable(false)}, {id: 2, isChecked: ko.observable(false)}, ...]);
    
    function checkAll() {
      items.forEach(function (item) {
        item.isChecked(true);
      });
    }
    
    KEDRIGERN
    KEDRIGERN --- ---
    Řeším takový problém.

    Mám objekty, které mají nějakou vlastnost. Např.:
    isChecked = ko.observable(false)

    Pak mám tabulku, kde dané objekty vykresluji. V jednom ze sloupců je checkbox:
    input type="checkbox" data-bind="checked: isChecked"

    A rád bych implementoval hromadné zaškrtávání checkboxů jako to má např gmail. Čili když zmačknu shift, tak se zaškrtne interval od posledního zaškrtnutého.

    Implementoval jsem to skrz JQuery, ale je to celé špatně. Absolutně mi nejde rozumně spojit JQuery model s knockoutem. Jak byste to řešili?
    RAPTORCZ
    RAPTORCZ --- ---
    Neřešil náhodou někdo použití modalu z Bootstrapu verze 3.x ve spojení s Knockoutem?
    Kliknutím sem můžete změnit nastavení reklam