3

I know that I can use the comment foreach in knockout to add conditions to lists. But I would like to add a default row to the table if the observableArray is empty.

Currently I do something like this:

<table>
    <!-- ko foreach: members -->
    <tr>
        <td data-bind="text: Id"></td>
        <td data-bind="text: FirstName"></td>
        <td data-bind="text: LastName"></td>
    </tr>
    <!-- /ko -->
    <tr data-bind="if: MemberCount == 0">
        <td colspan="3">
            No members have been added yet
         </td>
    </tr>
</table>

Is there a more elegant way?

egrunin
  • 24,650
  • 8
  • 50
  • 93
jgauffin
  • 99,844
  • 45
  • 235
  • 372
  • 1
    looks ok, I would hide membercount == 0 as isEmpty property. Bearing in mind that you can not do conditions within foreach It is good approach. – 0lukasz0 Jun 03 '13 at 18:17

3 Answers3

4

I agree with 0lukasz0 comment and would do computed property on the view model:

  model.hasNoMembers = ko.computed(function(){
    return model.members().length === 0;
  });

Html:

<table>
    <!-- ko foreach: members -->
    <tr>
        <td data-bind="text: Id"></td>
        <td data-bind="text: FirstName"></td>
        <td data-bind="text: LastName"></td>
    </tr>
    <!-- /ko -->
    <tr data-bind="if: hasNoMembers">
        <td colspan="3">
            No members have been added yet
         </td>
    </tr>
</table>
Tomas Kirda
  • 8,347
  • 3
  • 31
  • 23
3

Something like this would remove the need for any conditional comments, using data-bind only:

<tbody data-bind="foreach: members">
  <tr>
    <td data-bind="text: Id"></td>
    <td data-bind="text: FirstName"></td>
    <td data-bind="text: LastName"></td>
  </tr>
</tbody>
<tfoot data-bind="if: (memberCount == 0)">
 <tr>
    <td colspan="3">
        No members have been added yet
     </td>
</tr>
</tfoot>
Patrick D
  • 6,659
  • 3
  • 43
  • 55
1

What about this:

<table>           
    <tbody data-bind="foreach: members"> 
        <tr>
            <td data-bind="text: Id"></td>
            <td data-bind="text: FirstName"></td>
            <td data-bind="text: LastName"></td>
        </tr>
    </tbody>   

    <tbody data-bind="if: members().length == 0">
        <tr>
            <td colspan="3">No members have been added yet</td>
        </tr>
    </tbody>    
</table>

Proof on jsFiddle: http://jsfiddle.net/fkQQ2/

Vladimir Posvistelik
  • 3,843
  • 24
  • 28