<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Knockout</title>
        <link>http://blogs.ugidotnet.org/ainotame/category/Knockout.aspx</link>
        <description>Knockout</description>
        <language>it</language>
        <copyright>Roberto Sarati</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Knockout containerless binding</title>
            <link>http://blogs.ugidotnet.org/ainotame/archive/2012/02/07/knockout-containerless-binding.aspx</link>
            <description>&lt;p&gt;&lt;t&gt;In ambito XAML per mostrare una lista di elementi occorre impostare il datacontext di un ItemsControl ad una IEnumerable&lt;t&gt;. L’ItemsControl poi rendererizza la lista in base al DataTemplate specificato nella proprietà ItemTemplate. Per aggiungere oggetti nuovi ho sempre usato ItemTemplateSelector e/o CompositeCollection, ma la presenza di un container l’ho sempre considerata obbligatoria (correggetemi se sbaglio).&lt;/t&gt;&lt;/t&gt;&lt;/p&gt;
&lt;p&gt;&lt;t&gt;Ho considerato l’assioma valido anche in Knockout, ma non è così. Con knockout è possibile scrivere un “contenitore fittizio” tramite commenti:&lt;/t&gt;&lt;/p&gt;
&lt;p&gt;&lt;t&gt;&amp;lt;!-- ko ... --&amp;gt;&lt;br /&gt;
&amp;lt;!-- /ko --&amp;gt;&lt;/t&gt;&lt;/p&gt;
&lt;p&gt;&lt;t&gt;Tramite questa feature è possibile (come nel mio caso particolare) creare una tabella con un numero di colonne variabili:&lt;/t&gt;&lt;/p&gt;
&lt;p&gt;&lt;t /&gt;&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="classificationTable"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;thead&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;         &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;             &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Rank&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;             &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Country&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;             &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Full Name&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;             &lt;strong&gt;&lt;span class="rem"&gt;&amp;lt;!-- ko foreach: batteries --&amp;gt;&lt;br /&gt;&lt;/span&gt;                 &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt; &lt;span class="attr"&gt;data-bind&lt;/span&gt;&lt;span class="kwrd"&gt;="text: $data"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;span&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;             &lt;span class="rem"&gt;&amp;lt;!-- /ko --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;             &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;TOT&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;         &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;     &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;thead&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;     &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tbody&lt;/span&gt; &lt;span class="attr"&gt;data-bind&lt;/span&gt;&lt;span class="kwrd"&gt;="foreach: positions"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;         &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;             &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;data-bind&lt;/span&gt;&lt;span class="kwrd"&gt;="text: rank"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;             &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;data-bind&lt;/span&gt;&lt;span class="kwrd"&gt;="text: country"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;             &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;data-bind&lt;/span&gt;&lt;span class="kwrd"&gt;="text: fullname"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;             &lt;strong&gt;&lt;span class="rem"&gt;&amp;lt;!-- ko foreach: regularShots --&amp;gt;&lt;br /&gt;&lt;/span&gt;                 &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;data-bind&lt;/span&gt;&lt;span class="kwrd"&gt;="text: $data"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;            &lt;span class="rem"&gt;&amp;lt;!-- /ko --&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;             &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt; &lt;span class="attr"&gt;data-bind&lt;/span&gt;&lt;span class="kwrd"&gt;="text: totalRegularPoints"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;td&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;         &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tr&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;     &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;tbody&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;table&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Comodo, utile, veloce.&lt;/p&gt;
&lt;p&gt;Ps: gli elementi &amp;lt;td&amp;gt; chiudeteli sempre con un tag &amp;lt;/td&amp;gt;, non scriveteli con un tags self-closing &amp;lt;td data-bind="" /&amp;gt; altrimenti KnockoutJs potrebbe dare qualche problemino (e &lt;a target="_blank" href="http://dev.w3.org/html5/spec-author-view/syntax.html#syntax-start-tag"&gt;non solo lui&lt;/a&gt;)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/ainotame/aggbug/100755.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Roberto Sarati</dc:creator>
            <guid>http://blogs.ugidotnet.org/ainotame/archive/2012/02/07/knockout-containerless-binding.aspx</guid>
            <pubDate>Tue, 07 Feb 2012 00:09:47 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ainotame/archive/2012/02/07/knockout-containerless-binding.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ainotame/comments/commentRss/100755.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ainotame/services/trackbacks/100755.aspx</trackback:ping>
        </item>
        <item>
            <title>Knockout 2.0 released</title>
            <link>http://blogs.ugidotnet.org/ainotame/archive/2011/12/22/knockout-released.aspx</link>
            <description>&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;Anche se leggermente OT rispetto al mondo .net, notifico l'uscita di &lt;a href="http://knockoutjs.com/"&gt;Knockout &lt;/a&gt;v2.0.0; Per chi non sapesse cosa fosse, è un framework javascript che semplifica l'applicarazione del pattern MVVM (oramai noto in xaml) in javascript+html.&lt;/p&gt;
&lt;p&gt;Tra le nuove caratteristiche che ho notato velocemente, cito le seguenti:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;ViewModel&lt;/strong&gt;: negli esempi ora è rappresentato da una funzione (=oggetto)&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Computed properties&lt;/strong&gt;: ko.&lt;font face="Arial"&gt;dependentObservable è deprecato, ora è preferibile utilizzare ko.computed.&lt;/font&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Templating&lt;/strong&gt;: poiché &lt;a href="https://github.com/jquery/jquery-tmpl"&gt;jQuery.tmpl&lt;/a&gt; non è più in sviluppo, è stato modificato il motore di templating. Ora si può usare il binding di tipo foreach e altre tecniche. Probabilmente questa è una delle breaking changes maggiori per questa release. [+-datatemplate in xaml]&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Accesso a "DataContext" relativi&lt;/strong&gt;: è possibile utilizzare $data (contesto corrente), $parent (contesto padre), $parents[i] (i-esimo ancestor), $root (contesto root) [+- relativesource findancestor in xaml]&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Trottling&lt;/strong&gt;: è possibile propagare una modifica del viewmodel alle altre proprietà (per esempio le computed properties) dopo un determinato periodo di tempo. Si può specificare con:&lt;br /&gt;
    ko.computed(function() {}).extend({trottle: 1000}); //attende 1000ms a ricalcolare la proprietà computed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sono state aggiunte altre feature non citate e, osservando il forum ufficiale, è stato effettuato anche un discreto periodo di sviluppo per migliorare le prestazioni nei vari browser attualmente sul mercato.&lt;/p&gt;
&lt;p&gt;E io che 'odiavo' javascript...&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/ainotame/aggbug/100647.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Roberto Sarati</dc:creator>
            <guid>http://blogs.ugidotnet.org/ainotame/archive/2011/12/22/knockout-released.aspx</guid>
            <pubDate>Thu, 22 Dec 2011 02:09:14 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/ainotame/archive/2011/12/22/knockout-released.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/ainotame/comments/commentRss/100647.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/ainotame/services/trackbacks/100647.aspx</trackback:ping>
        </item>
    </channel>
</rss>