Jquery templates 如何将foreach与特殊的第一个元素一起使用?

Jquery templates 如何将foreach与特殊的第一个元素一起使用?,jquery-templates,knockout.js,Jquery Templates,Knockout.js,如果我有一个可观察的数组 foos = [{ name: "a" }, { name: "b" }, { name: "c" }] 在我的viewmodel上,我希望渲染以下内容: 这里有特殊的东西 a b c 我和他关系很好 这里有特殊的东西 但结果是在a、b、c之后添加了。添加新的foo 有什么想法吗?在我的例子中,使用Knockoutforeach而不是jQuery模板的{{each}}是至关重要的,因为。由于目前没有一种方法可以告诉模板绑定在何处呈现模板,我现在看不到一种

如果我有一个可观察的数组

foos = [{ name: "a" }, { name: "b" }, { name: "c" }]
在我的viewmodel上,我希望渲染以下内容:

  • 这里有特殊的东西
  • a
  • b
  • c
我和他关系很好

  • 这里有特殊的东西
  • 但结果是在a、b、c之后添加了
    。添加新的foo


    有什么想法吗?在我的例子中,使用Knockout
    foreach
    而不是jQuery模板的
    {{each}}
    是至关重要的,因为。

    由于目前没有一种方法可以告诉模板绑定在何处呈现模板,我现在看不到一种更干净的方法来完成这项工作,除了以下内容:

    <ul data-bind="template: { name: 'foo-template', foreach: foos, templateOptions: { first: foos()[0]} }">
    </ul>
    
    <script id="foo-template" type="text/html">
        {{if $item.first === $data}}
        <li class="add-new-foo">Special stuff here</li>
        {{/if}}
        <li data-bind="text: name"></li>
    </script>
    
    {{如果$item.first===$data}
  • 这里有特殊的东西
  • {{/if}
  • 因此,我们将数组中的第一个项作为templateOptions传递,并检查我们在模板中处理的项是否确实是第一个

    此处示例:

    此外,templateOptions是在1.12ko之后添加的,所以您需要代码。有关templateOptions的更多信息


    希望这能有所帮助。

    看来,在KO 1.3 2.0中,新的无容器控制流和
    foreach
    绑定将成为可能:

    • 静态项
    有关详细信息,请参阅本文:

    
    你的代码
    
    这是:

    <ul>
        <li>Static item</li>
        <!-- ko foreach: products -->
            <li data-bind="text: name"></li>
        <!-- /ko -->
    </ul>
    
    • 静态项
    在IE8中不起作用。我倾向于那种情况下的模板答案。还有其他想法吗

    编辑:以下是IE8-knockout 2.2.1中的工作原理:根据以下注释的底部使用选项绑定:


    看起来不错。特别是如果我使用模板组合将“真实模板”与代理模板分离。理论上,我认为最好的解决方案是添加一个
    标记(或类似标记),这样该标记尤其会被替换为数据绑定的结果,而不是填充。然后,
    可以包含一个
  • 和一个
    属性值,该属性值当前位于
      上。也许我会尝试fork KO并在某个时候补充一下……一种方法是使用数组的sort函数。你可以定义你自己的排序函数,在这里你总是可以把特殊的东西放在最上面。我想建议把第一个项目添加到数组中,但看起来他的第一个项目是不同的动物,而不是他想和他的耳环混在一起的东西(任何对数组中的项进行操作的操作都必须知道此项是不同的,并且在返回服务器时必须将其过滤掉)。但可能对他有用。是的,第一项实际上不是视图模型的一部分,而是视图的一部分。这就是答案,因为问题是“如何使用没有元素的foreach”
      
      <!-- ko if: $index() == 0 -->
      your code
      <!-- /ko -->
      
      <ul>
          <li>Static item</li>
          <!-- ko foreach: products -->
              <li data-bind="text: name"></li>
          <!-- /ko -->
      </ul>