1

我更新了小提琴。在这个小提琴中,我有 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 内的信息很大,我想将它转移到一个选择中。

我也知道我可以使用样式绑定来获取宽度,但我的 viewModel 上不需要它,所以我只想将它放在我的 bindingHandler 中。

如何让 bindingHandler 充当具有 items 值的 foreach?

这是我现在的测试

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
    }
}};    
4

1 回答 1

1

你很亲密。

html是

<div data-bind="foreach: developers"> 
  <span data-bind="textWidth:$data, sourceArray:$root.developers,
                   overflowArray:$root.overflow"></span> 
</div>

请注意,我在<span>关卡中添加了额外的绑定,而不是<div>. 这是因为它必须检查每个<span>绑定。

关键的 JavaScript 是

ko.bindingHandlers['textWidth'] = {
  'update': function (element, valueAccessor, allBindingsAccessor) {
    var allBindings = allBindingsAccessor();
    // use ko text binding to do actual output.
    ko.bindingHandlers['text'].update(element, valueAccessor);
    var value = valueAccessor();
    ko.utils.unwrapObservable(value);
    var $parentEement = $(element).parent();

    var childSum = 0;
    $parentEement.children().each(function () {
      childSum += $(this).width();
    });

    if (childSum > $($parentEement[0]).width()) {
      var source = allBindings.sourceArray;
      var overflow = allBindings.overflowArray;
      source.remove(value);
      overflow.push(value);
      $(element).text('');
    }
  }
};

更新的小提琴位于http://jsfiddle.net/DbJBs/17/

于 2013-01-13T22:22:11.800 回答