2013-11-26 40 views
0

我想创建一个自定义绑定,其行为与if绑定相似,但不是完全删除该元素,而是将其替换为应该删除的另一个具有相同高度的元素。Knockoutjs if/shim binding

我正在努力寻找一种做法,这不是哈克。我不太了解淘汰赛的内幕,以一种有教养的方式去解决这个问题。

任何指针非常赞赏。

谢谢!

+0

你能不能结合'如果解决这个问题:[条件]'和'CSS:{ shim:[condition]}'然后在css中隐藏你的内容:'.shim {visibility:hidden}'? – sroes

+0

好主意。我需要的不仅仅是一个纯粹的CSS解决方案,因为我需要将'.shim'的高度设置为删除点处已移除元素的高度。 – Finbarr

回答

1

你可以编写自己的绑定:

ko.bindingHandlers.shim = { 
    update: function(element, valueAccessor, allBindings) { 

     // First get the latest data that we're bound to 
     var value = valueAccessor(); 

     // Next, whether or not the supplied model property is observable, get its current value 
     var shim = ko.unwrap(value); 

     if (shim) { 
      var shimEl = $(element).data('shim'); 
      // Create the shim element if not created yet 
      if (!shimEl) { 
       shimEl = $('<div />').addClass('shim').appendTo(element); 
       // Equal the height of the elements 
       shimEl.height($(element).height()); 
       $(element).data('shim', shimEl); 
      } 
      shimEl.show(); 
     } else { 
      var shimEl = $(element).data('shim'); 
      if (shimEl) { 
       shimEl.hide(); 
      } 
     } 

     // You can also trigger the if-binding at this point 
     // ko.bindingHandlers.if.update(element, valueAccessor, allBindings); 
    } 
}; 

然后使用它是这样的:

<div data-bind="shim: [condition]"></div> 
+0

啊,这真是太好了 - 代表团的下一个“if”装订是失踪的一块。谢谢! – Finbarr

+0

不客气:) – sroes

+0

几个关于得到这个工作的笔记。 'if'绑定也需要'init'。此外,您需要在'ko.bindingHandlers.if.update'的调用中将'valueAccessor'的相反值作为函数传递。否则,解决方案完美地工作,我真的很感谢你的帮助! – Finbarr