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()));
}
};
謝謝瑞安。我多次查看了[custom-bindings](http://knockoutjs.com/documentation/custom-bindings.html)文檔,但沒有仔細閱讀viewModel描述。我認爲它指的是整個視圖模型,而不是描述中陳述的單個項目。 – Jerry 2012-04-16 15:26:24
我認爲我們應該將'viewModel'的參數名稱改爲'data'或其他東西。通常不清楚它不涉及根視圖模型。 – 2012-04-16 16:28:49