フィドルを更新しました。このフィドルには3つのdivがあります。中央のdivには、ループアウトするテキストがあります。divが小さすぎる場合は、アイテムを取り出して、このような選択された種類にバインドされている別のobservableArrayに配置します。
<div data-bind="collection:{items:itemsThatFit,itemsDontFit:itemsDontFit">
<span data-bind="text:$data"></span>
</div>
<select data-bind="visible:itemsDontFit.length>0, options: itemsDontFit"></select>
フィドルでは、多くに追加すると収まらないので、itemsDontFit配列に移動したいと思います。この問題を正しい角度から攻撃するのに苦労していて、助けが必要です。
私はフィドルが解決策の近くにないことを知っています。div内の情報が大きすぎることを示したかったので、それをselectに転送したいと思います。
スタイルバインディングを使用して幅を取得できることも知っていますが、viewModelには必要ないので、bindingHandlerにのみ入れたいと思います。
項目値を使用してforeachとして機能するbindingHandlerを取得するにはどうすればよいですか?
これは今の私のテストです
ko.bindingHandlers.collection = {
init: function (element, valueAccessor) {
var value = valueAccessor();
ko.utils.unwrapObservable(value);
var $elm = $(element);
//here I want a foreach on the itemsThatFit
//maybe add the select in code here?
},
update: function (element, valueAccessor) {
var value = valueAccessor();
ko.utils.unwrapObservable(value);
var $elm = $(element);
//the div width
var containerWidth = $elm.width();
//the children width
var childSum = 0;
$elm.children().each(function() {
childSum + $(this).width());
});
if(childSum>containerWidth){
//move last item to itemsDontFit
}
}};