2012-04-13 144 views
2

背景可觀察數組中項目屬性的自定義綁定,如何訪問該項目?

我有一個可觀察到的GalleryImages陣列,其中每個項目具有與圖像有關的(名稱,描述,路徑,等..)的性質。敲除foreach遍歷對象數組以生成包含圖像,名稱和描述的跨度。如果用戶點擊圖像名稱或描述,他們可以編輯該值並按保存/取消來更新視圖模型。

問題

鑑於自被綁定到某個項目的屬性可觀察到的陣列中,你如何訪問自定義綁定的定義裏面的屬性屬於該項目?我想抓取剛剛編輯的項目,並將其傳遞給可以使用更改更新服務器的函數。

我試着看allBindingsAccessor(),但它返回的是物品的屬性,而不是物品本身。

HTML

<div data-bind="foreach: GalleryImages"> 
    <span class="img"> 
     <a data-bind="attr: { href: URL}"> 
      <img data-bind="attr: { src: URL}"/> 
     </a> 
     <div> 
      <h4 data-bind="text: ItemName"></h4> 
      <input type="text" data-bind="clickEditor: ItemName"/> 
     </div> 
     <div> 
      <span data-bind="text: Description"></span> 
      <textarea data-bind="clickEditor: Description"></textarea> 
     </div> 
    </span> 
</div> 

knockoutJS這裏的風俗爲clickEditor

ko.bindingHandlers.clickEditor = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     var $element = $(element).hide(); 
     var $text = $element.prev(); 
     var $parent = $element.parent(); 

     var $editElements = $("<div class='editConfirm'> \ 
      <button class='saveEdit' type='button'>Save</button> \ 
      <button class='cancelEdit' type='button'>Cancel</button> \ 
     </div><span class='placeHolder'></span>").hide().insertAfter($element).add($element); 

     var _toggle = function (edit) { 
      $text[edit ? 'hide' : 'show'](); 
      $editElements[edit ? 'show' : 'hide'](); 
     }; 

     $text.click(function (e) { 
      _toggle(true);    
     }); 

     $editElements.find('.saveEdit').click(function() { 
      _toggle(false); 

      //update clientside viewModel 
      valueAccessor()($element.val()); 

      // this var needs to contain the item in the observable array that was updated 
      var imageUpdated; 

      //update server with changes 
      saveModel(imageUpdated); 
     }); 

     $editElements.find('.cancelEdit').click(function() { 
      _toggle(false); 
      $(element).val(ko.utils.unwrapObservable(valueAccessor())); 
     }); 
    } 
    , update: function (element, valueAccessor) { 
     $(element).val(ko.utils.unwrapObservable(valueAccessor())); 
    } 
}; 

回答

2

結合從數據綁定屬性可以訪問數據使用$data當前範圍。

如果您處於綁定狀態,則參數(第4個參數)實際上是當前綁定的數據(因此您的數組項是在這種情況下)。在KO 2.0中實際上也有第五個參數,這是上下文。上下文包含$data,$parent,$parents$root

所以,你最好的選擇是在綁定中使用viewModel arg。

+0

謝謝瑞安。我多次查看了[custom-bindings](http://knockoutjs.com/documentation/custom-bindings.html)文檔,但沒有仔細閱讀viewModel描述。我認爲它指的是整個視圖模型,而不是描述中陳述的單個項目。 – Jerry 2012-04-16 15:26:24

+2

我認爲我們應該將'viewModel'的參數名稱改爲'data'或其他東西。通常不清楚它不涉及根視圖模型。 – 2012-04-16 16:28:49

相關問題