2014-01-24 107 views
0

我有一個jquery knockout模板,它呈現foreach模板內部敲除保存變量

每個項目裏面,我現在用的是同樣的功能很多次(爲css結合和其他子元素的可見性)

是否有可能的,而不是調用同一個功能爲每個項目多次在foreach ,臨時保存它,然後在模板內重新使用它?

PS:我知道我可以使用css選擇器設置<i class="fa " />標籤的可見性,但是這不能回答問題。

<script type="text/html" id="properties-template"> 
    <!-- ko foreach: Groups --> 

     <!-- saving the result in a variable instead of calling it so many times --> 
     <!-- var isValid = isGroupValid($data); !--> 

     <div class="group" data-bind="css: { 'valid': isGroupValid($data) }"> 
      <div class="iconContainer"> 
       <!-- ko if: $root.isGroupValid($data) === false --> 
        <i class="fa fa-square-o"></i> 
       <!-- /ko --> 
       <!-- ko if: $root.isGroupValid($data) === true --> 
        <i class="fa fa-check-square"></i> 
       <!-- /ko --> 
      </div> 
     </div> 
    <!-- /ko --> 
</script> 

回答

1

由於$data本身就是視圖模型,你可以只是有一個計算觀察到的有哪些爲所欲爲邏輯isGroupValid目前做。所以,我認爲在目前的視圖模型看起來像

function ViewModel(){ 
    this.isGroupValid = function(data){ 
     // some logic returning boolean 
    } 
} 

這裏是一個活生生的例子證明「之前」:它http://jsfiddle.net/hbSj7/

改成這樣:

function ViewModel(){ 
    this.isGroupValid = ko.computed(function(){ 
     // some logic returning boolean 
     // just use "this" where you used to use "data" 
    }, this); 
} 

然後,只需改變你模板,例如/

<div class="group" data-bind="css: { 'valid': isGroupValid() }"> 
    <div class="iconContainer"> 
     <!-- ko if: !isGroupValid() --> 
      <i class="fa fa-square-o"></i> 
     <!-- /ko --> 
     <!-- ko if: isGroupValid() --> 
      <i class="fa fa-check-square"></i> 
     <!-- /ko --> 
    </div> 
</div> 

這是一個現場實例le改變了這種方法:http://jsfiddle.net/ug9ax/

重要的區別在於你的當前方法每次調用它時函數都會被執行,而改變的方法只有計算得到的值纔會被重新評估,您的視圖模型中的可觀察屬性。

+0

This Works,thanks。我會換成'ko.computed'。除此之外,可以在模板中創建變量嗎? (說在某一刻,也許我會需要他們) – Catalin

+0

我不這麼認爲,雖然[文檔](http://knockoutjs.com/documentation/template-binding.html)描述使用其他模板引擎,他們可能會支持變量。 – Jamiec