2014-09-30 71 views
0

我已經得到了我想要使用淘汰賽使用下面的代碼綁定一個div:淘汰賽結合拋出「無法處理綁定」例外IE8

<div data-bind="style: { height: ($('.someDiv').height() - 37) + 'px' }">...</div> 

這工作完全在Chrome中,FF或IE11。不確定它已經在IE9-10上測試過了。但它在IE8上失敗,拋出了「無法處理綁定」異常。

出人意料的是,這個工程:

// without substracting 37 
style: { height: ($('.someDiv').height() + 'px' } 

// replacing 37 by the same computed value, doesn't matter if it ends up being 0 
style: { height: ($('.someDiv').height() - $('.someDiv').height()) + 'px' } 

但更令人驚訝的,這也失敗了:

// replacing 37 by something (dumb) assuring a positive value 
style: { height: ($('.someDiv').height() - $('.someDiv').height() + $('.someDiv').height()) + 'px' } 

我有點無知在這裏。任何人都知道這件事?

我使用jQuery 1.11.1和Knockout 3.1.0。

編輯:

好,我向前移動了一點。看來div someDiv是在自定義綁定中使用模板注入的。因此,如果我做這樣的事情周圍的結合:

console.log('before ko'); 
console.log('length:'+$('.someDiv').length); 
console.log('$height:'+$('.someDiv').height()); 

ko.applyBindings(vm, $('#container').get(0)); 

console.log('after ko'); 
console.log('length:'+$('.someDiv').length); 
console.log('$height:'+$('.someDiv').height()); 

的輸出(無論是在IE8和Chrome瀏覽器):

before ko 
$length:0 
$height:null 
after ko 
$length:1 
$height:762 

所以我想結合這取決於中有事不同在淘汰賽瀏覽器。

+0

你應該隔離這個問題 - 我敢打賭,只是'$ .height'在IE8中失敗。你使用的是什麼版本的jQuery?你可以寫一個函數或者其他的東西來驗證'$('。someDiv')的值。height()'是你期望的嗎? – xdumaine 2014-09-30 12:42:52

+0

我會嘗試並編輯問題。但是如果兩個工作測試都沒有失敗,那麼它怎麼才能成爲'$ .height'呢? – 2014-09-30 12:51:36

+0

是否有異常的任何詳細信息 - 我有時會發現,如果你進一步深入到堆棧跟蹤在淘汰賽時綁定錯誤發生,你經常會發現一個更有意義的信息隱藏掉 – 2014-09-30 13:01:00

回答

2

我意識到我的答案可能不是一個直接的答案,但因爲它可以幫助你或其他人來到這裏反正我仍然會發布它。誰知道,其他人可能會提出更直接的答案。

您的問題可能是由於邏輯從data-bind屬性輸入KO作爲字符串,並在之後執行。將這種邏輯放在視圖之外並將其放入JavaScript代碼中可能會有所幫助。無論如何,這將使調試更容易。

可用於執行此操作的一個KO功能是使用自定義bindingHandler。這裏是你如何能做到這一點:

ko.bindingHandlers.fixHeight = { 
 
    update: function(element, valueAccessor, allBindings) {   
 
     var h = ($('.someDiv').height() - 37) + 'px'; 
 
     $(element).height(h); 
 
    } 
 
}; 
 

 
ko.applyBindings({});
div { 
 
    display: inline-block; 
 
    background-color: red; 
 
} 
 

 
.someDiv { 
 
    height: 123px; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.1.0/knockout-min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 

 
<div class="someDiv">someDiv</div> 
 
<div data-bind="fixHeight">...</div>

如果我把我的IE11版本IE8進入模式,上述工作正常。

同樣,我意識到這可能不是一個直接的答案,但也許它對人們來說是有用的。

+0

非常感謝,我不確定我是否明白爲什麼在這種情況下會出現問題,但我最終使用了此變量(包含jQuery選擇器和偏移量的valueAccessor)。 – 2014-10-01 10:06:57

+0

很高興幫助。隨時編輯我的答案,幷包括您需要的更改:它也可以幫助其他人。 – Jeroen 2014-10-01 10:53:00