observablearray knockoutjs knockout else data knockout.js

knockout.js - else - knockoutjs variables



KnockoutJS if statement dentro de foreach loop (2)

Aquí tengo este código:

<tbody data-bind="foreach: entries"> <tr> <td><i class="icon-file"></i> <a href="#" data-bind="text: name, click: $parent.goToPath"></a></td> </tr> </tbody>

Me gustaría tener algo así (es un pseudocódigo):

<tbody data-bind="foreach: entries"> <tr> <td><i class="{{ if type == ''file'' }} icon-file {{/if}}{{else}} icon-folder {{/else}}"></i> <a href="#" data-bind="text: name, click: {{ if type == ''file'' }} $parent.showFile {{/if}}{{else}} $parent.goToPath {{/else}}"></a></td> </tr> </tbody>

¿Es posible escribir algo como esto en KnockoutJS?


Puede usar la sintaxis de flujo de control sin contenedor, que se basa en etiquetas de comentario:

<tbody data-bind="foreach: entries"> <tr> <!-- ko if: type === "file" --> <td><i class="icon-file"></i> <a href="#" data-bind="text: name, click: $parent.showFile"></a></td> <!-- /ko --> <!-- ko if: type !== "file" --> <td><i class="icon-folder"></i> <a href="#" data-bind="text: name, click: $parent.goToPath"></a></td> <!-- /ko --> </tr> </tbody>


Una opción es hacer algo como:

<tbody data-bind="foreach: entries"> <tr> <td> <!-- ko if: type === ''file'' --> <i class="icon-file"></i> <a href="#" data-bind="text: name, click: $parent.showFile"></a> <!-- /ko --> <!-- ko if: type !== ''file'' --> <i class="icon-folder"></i> <a href="#" data-bind="text: name, click: $parent.goToPath"></a> <!-- /ko --> </td> </tr> </tbody>

Muestra aquí: http://jsfiddle.net/rniemeyer/9DHHh/

De lo contrario, puede simplificar su vista moviendo un poco de lógica en su modelo de vista como:

<tbody data-bind="foreach: entries"> <tr> <td> <i data-bind="attr: { ''class'': $parent.getClass($data) }"></i> <a href="#" data-bind="text: name, click: $parent.getHandler($data)"></a> </td> </tr> </tbody>

Luego, agregue métodos en su modelo de vista para devolver el valor apropiado:

var ViewModel = function() { var self = this; this.entries = [ { name: "one", type: ''file'' }, { name: "two", type: ''folder'' }, { name: "three", type: ''file''} ]; this.getHandler = function(entry) { console.log(entry); return entry.type === ''file'' ? self.showFile : self.goToPath; }; this.getClass = function(entry) { return entry.type === ''file'' ? ''icon-file'' : ''icon-filder''; }; this.showFile = function(file) { alert("show file: " + file.name); }; this.goToPath = function(path) { alert("go to path: " + path.name); }; };

Muestra aquí: http://jsfiddle.net/rniemeyer/9DHHh/1/