根據建議給予here,以及給出的信息here關於如何爲forEach做一個自定義bindingHandler,我決定嘗試寫我自己的自定義綁定forEach和砌體。自定義綁定爲砌體如何將適當調整容器
因爲元素是在動態添加的,所以不會重新繪製和移動元素以填充空間。因此,在添加每個項目之後呈現或調用元素之後,需要移動此功能。
這裏是我的bindingHandler
ko.bindingHandlers.masonry = {
init: function (element, valueAccessor, allBindingsAccessor) {
var $element = $(element),
originalContent = $element.html();
$element.data("original-content", originalContent);
//var msnry = new Masonry($element);
return { controlsDescendantBindings: true }
},
update: function (element, valueAccessor, allBindingsAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor()),
//get the list of items
items = value.items(),
//get a jQuery reference to the element
$element = $(element),
//get the current content of the element
elementContent = $element.data("original-content");
$element.html("");
var container = $element[0];
var msnry = new Masonry(container);
for (var index = 0; index < items.length; index++) {
(function() {
//get the list of items
var item = ko.utils.unwrapObservable(items[index]),
$childElement = $(elementContent);
ko.applyBindings(item, $childElement[0]);
//add the child to the parent
$element.append($childElement);
msnry.appended($childElement[0]);
})();
msnry.layout();
msnry.bindResize();
}
}
};
和執行處理程序的HTML。
<div id="criteriaContainer" data-bind="masonry: { items: SearchItems.Items }">
<div class="searchCriterion control-group">
<label class="control-label" data-bind="text: Description"></label>
<div class="controls">
<input type="hidden" data-bind="value: Value, select2: { minimumInputLength: 3, queryUri: SearchUri(), placeholder: Placeholder(), allowClear: true }" style="width: 450px">
</div>
<p data-bind="text: Value"></p>
</div>
</div>
當這顯示在頁面上它所有疊加如果通過追加方式呈現的右上彼此頂部的元素。
你可以在我的bindingHandler中看到我調用了bindResize以及layout(),這兩者似乎都沒有任何作用。
下面是它在UI中的外觀截圖。