2013-04-15 73 views
3

我列出在Twitter的引导界面类似这样的房间:淘汰赛找不到注释结束标签来

<div class="row-fluid"> 
    <!-- ko foreach: rooms --> 
     <!-- ko if: $index() % 4 == 3 --> 
      </div><div class="row-fluid"> 
     <!-- /ko --> 
    <span data-bind="text: $index() % 4"></span> 

     <section class="span4"> 
      <address data-bind="text: pruebaComputed"></address> 
      <address data-bind="text: number"></address> 
     </section> 
    <!-- /ko --> 
</div> 

所以当你看到IM上市房和IM试图插入一个行流体一个div类遵循bootstrap的方式,在行中打破的东西...

但我想我遇到了一个错误,因为淘汰赛不能处理嵌套的无货运营商..即时我对不对?我该如何解决这个问题?

谢谢!

回答

10

Knockout可以处理嵌套的无容器控件。这是a fiddle,它改变了嵌套的内容,以证明它的工作原理。

问题是,淘汰赛不仅仅是放置字符串,它解析模板的内容来为html创建一个javascript模板。你是假的接近导致这个错误,因为它不明白结构你给它:

Uncaught Error: Cannot find closing comment tag to match: ko foreach: rooms

我不知道,因为它是我所说的这个错误,这么多在Knockout中缺少对模板中动态结构的支持。

这是不合法的:

<!-- ko if: $index() % 4 == 3 --> 
     </div><div class="row-fluid"> 
<!-- /ko --> 

因为它的收盘尚未启动的标签。

5

感谢Tyrsius,你一言我注意到,我不得不改变我的策略:)所以我增加了一个计算到我的视图模型来打破我的名单中排这样的:

vm.separarEnFilas = ko.computed(function() { 

    var rooms = this.rooms(), 
     result = []; 
    for (var i = 0; i < rooms.length; i += 4) { 
     var row = []; 
     for (var j = 0; j < 4; ++j) { 
      if (rooms[i + j]) { 
       row.push(rooms[i + j]); 
      } 
     } 
     result.push(row); 
    } 
    return result; 

},vm); 

然后在我的查看我做到了这一点:

<div class="room-list" data-bind="foreach: separarEnFilas"> 
    <div class="row-fluid" data-bind="foreach: $data"> 
     <article class="span3"> 
      <div> 
       <address data-bind="text: number"></address> 
      </div> 
     </article> 
    </div> 
</div> 
+1

这是一个很好的解决方案,很好的工作。我要做的一件事就是将外部绑定修改为'foreach:{data:separarEnFilas,如'row'}',并将内部绑定修改为'foreach:row'。它只是使阅读更容易。 – Tyrsius

+0

:)谢谢!很高兴知道 –