2012-08-28 49 views
0

我想知道您是否遇到以下問題,並且可能知道解決方法。knockout.js id處理錯誤?

如果我在ko模板中有一個'foreach'迭代並嘗試使用'with'上下文修飾符,ko無法處理迭代的第一項(是的,只有第一個)如果'with'試圖綁定到一個名爲'id'的屬性。

例子:http://jsfiddle.net/rG5Xw/8/

如果你運行它,它不會顯示的第一個項目,但如果你改變了內部虛擬元素的「與」聲明「名」,那麼預期它會工作。漂亮的討厭...:S

有沒有人有一個想法如何解決這個問題?

在此先感謝!

+0

一個更簡單的例子表明,問題是由於處理零點奇怪而引起的,每當您嘗試創建一個'with'上下文更改爲包含單個零號的屬性時,它將失敗: [link] http: //jsfiddle.net/rG5Xw/9/ 如果您將視圖模型的'item'屬性的值更改爲零,則不會在範圍內呈現任何內容'with'聲明... – kataik

+0

不知道你在說什麼..你的小提琴可以很好的顯示所有3個項目,並且沒有什麼叫'id'。如果我將「名稱」更改爲「ID」,它仍然[正常工作](http://jsfiddle.net/antishok/rG5Xw/10/)。 – antishok

+0

@antishok:「如果您將視圖模型的'item'屬性的值更改爲零,則'with'語句」 – kataik

回答

1

with是爲了與對象一起使用。所以它對真實性進行了簡單的檢查,認爲零是錯誤的。您可以通過數字轉換爲字符串解決這個問題:http://jsfiddle.net/rG5Xw/11/

編輯:這是基於我對withlight一個with更換不這樣做值的任何檢查(例如:http://jsfiddle.net/mbest/rG5Xw/12/):

ko.bindingHandlers['mywith'] = { 
    'init': function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     var bindingValue = ko.utils.unwrapObservable(valueAccessor()); 
     var innerContext = bindingContext['createChildContext'](bindingValue); 
     ko.applyBindingsToDescendants(innerContext, element); 
     return { 'controlsDescendantBindings': true }; 
    } 
}; 
ko.virtualElements.allowedBindings.mywith = true; 
+0

「的範圍內不會顯示任何內容,謝謝您的回答。我知道它可以與字符串以及任何其他數據(包括數字)一起使用。當然零除外。我沒有看到檢查「真實性」的重點,而不是檢查該值是否未定義。我也不明白爲什麼沒有任何呈現儘管包裝HTML元素。它不應該迭代,或者它應該,但是然後將數據處理爲空,而不是整個內容。並且它也應該處理任何數據,絕對零,但還未定位等。 – kataik

+0

我添加了一個自定義綁定,你可能會發現你的情況有用。 –

+0

非常好的主意確實使用自定義綁定來代替綁定 - 完美的作品,謝謝:) – kataik