2014-10-06 70 views
0

我的目标是显示“noSets”模板,如果observableArray长度小于0并且呈现模板带有项目详细信息 - “showSets”,如果observableArray长度大于0 。我想为此使用模板,但FireBug显示错误:无法找到ID为“templatename”的模板。 这里是视图模型:Knockout.js动态选择模板错误:“无法找到具有ID的模板”

function SetsViewModel() { 
      var self = this; 
      self.usersets = ko.observableArray(); 
      self.getTemplate = function() { 
       return self.usersets().length > 0 ? "showSets" : "noSets"; 
      } 
    } 
$(document).ready(function() { 
      ko.applyBindings(new SetsViewModel(), document.getElementById('user_sets')); 
}); 

这里是HTML标记:

<div data-bind="template: { name: $root.getTemplate, foreach: usersets }" id="user_sets"> 
      <script type="text/html" id="noSets"> 
       <p>You do not have items yet.</p> 
      </script> 
      <script type="text/html" id="showSets"> 
       <div class="block"> 
        <input type="hidden" data-bind="value: $data.SetId" /> 
        <div class="fav" data-bind="css: { fullop: $data.IsFavorite == true }"> 
         <img alt="" src="img/fav.png" data-bind="click: $root.setFavorite"> 
        </div> 
        <div> 
         <img alt="" data-bind="attr: { src: $data.SetImg }"> 
        </div> 
        <div class="txt"> 
         <h3 data-bind="text: $data.SetName, click: $root.go"></h3> 
         <p><span data-bind="text: $data.ItemsNumber + ' вещей,'"></span><span data-bind=" text: ' общая цена ' + $data.SetPrice + ' руб'"></span></p> 
        </div> 
       </div> 
      </script> 
     </div> 

我怎样才能解决呢?

+1

你试图把模板外'div'标签:相反,那么,当有0项展示一个完全不同的div更合适? – 2014-10-06 15:32:03

回答

1

您可以将div之外的模板声明为您要绑定的模板。作为@JeffMercado指出:

The actual problem was that since the user_sets uses a template binding, the body is discarded (and the templates along with it)

function SetsViewModel() { 
 
      var self = this; 
 
      self.usersets = ko.observableArray([{SetId: 1, SetName: 'Name 1'}]); 
 
      self.getTemplate = function() { 
 
       return self.usersets().length > 0 ? "showSets" : "noSets"; 
 
      } 
 
    } 
 
$(document).ready(function() { 
 
      ko.applyBindings(new SetsViewModel(), document.getElementById('user_sets')); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<script type="text/html" id="noSets"> 
 
    <p>You do not have items yet.</p> 
 
</script> 
 
<script type="text/html" id="showSets"> 
 
    <div class="block"> 
 
     <input data-bind="value: $data.SetId" /> 
 
     <div class="txt"> 
 
      <h3 data-bind="text: 'Set name:' + $data.SetName"></h3>       
 
     </div> 
 
    </div> 
 
</script> 
 

 
<div data-bind="template: { name: getTemplate, foreach: usersets }" id="user_sets"> 
 
</div>

+0

谢谢@Tanner,我不知道。 – 2014-10-06 15:39:22

+0

模板不一定必须出现在使用它们的绑定之前,直到文档准备就绪才会应用绑定,以便它们在那时存在。 _actual_问题是因为'user_sets'使用了一个模板绑定,所以正文被丢弃了(和模板一起)。 – 2014-10-06 15:50:57

1

我想命名模板可能是错误的做法,以这个具体问题 - 他们更设计为当你想为每个项目不同的模板,这里不是这种情况。

<div data-bind="visible: usersets().length == 0"> 
    You have no sets 
</div> 

<div data-bind="visible: usersets().length > 0, foreach: usersets" id="user_sets"> 
    <div class="block"> 
     <input type="hidden" data-bind="value: $data.SetId" /> 
     <div class="fav" data-bind="css: { fullop: $data.IsFavorite == true }"> 
      <img alt="" src="img/fav.png" data-bind="click: $root.setFavorite"> 
     </div> 
     <div> 
      <img alt="" data-bind="attr: { src: $data.SetImg }"> 
     </div> 
     <div class="txt"> 
      <h3 data-bind="text: $data.SetName, click: $root.go"></h3> 
      <p><span data-bind="text: $data.ItemsNumber + ' вещей,'"></span><span data-bind=" text: ' общая цена ' + $data.SetPrice + ' руб'"></span></p> 
     </div> 
    </div> 
</div> 
+0

我也尝试过这种方法,但没有成功,可能我以前做错了什么。 – 2014-10-06 15:41:57