2014-10-29 118 views
3

我在使用foreach綁定函數列表時遇到了問題。我希望內部上下文成爲函數本身,但相反,上下文被綁定到調用函數的結果。下面是說明了一個簡單的例子:(JSFiddleKnockout foreach與函數列表

JS:

ko.applyBindings({ 
    list: [ 
     function() { 
      return "hodor"; 
     } 
    ] 
}); 

HTML:

<!-- ko foreach: list --> 
<span data-bind="text: typeof $data"></span> 
<span data-bind="text: $data"></span> 
<br /> 
<!-- /ko --> 

輸出是: 「字符串foo」 的,但我想它是「功能函數(){return「foo」;}「

作爲解決方法,我可以做$parent.list[$index()],但這真的很難看,如果可能,我想避免使用該語法。

(對於我的實際使用說明,這些都不是我所附加的額外屬性,我要引用簡單的功能,但功能,但我不能引用他們,因爲淘汰賽被調用它們)

編輯:

看來,這裏有一個KO版本的問題。在3.0之前,這不是問題,上下文總是與函數而不是價值綁定。在3.0上,使用$rawData會給出函數,而不是該值,但在3.2,它不會,這是我正在嘗試使用的。

我已經更新上面的小提琴使用3.2,而這裏的每個版本提琴,包括$rawData(除2.3其中$ RAWDATA不存在)

Knockout 2.3 fiddle$rawData不需要

Knockout 3.0 fiddle$rawData作品

Knockout 3.2 fiddle$rawData不起作用。

難道這是一個KO 3.2的錯誤?

+0

我敢肯定,它有些混淆了它如何假設一個函數將成爲一個可觀察對象,因此調用它。一個可能的解決辦法可能是將你的函數封裝在另一個函數中,像這樣:http://jsfiddle.net/dq4ec706/3/但是看起來確實很愚蠢。它使'$ data'在3.0和3.2都可以工作,但不能在2.3。 – 2014-10-29 18:12:05

+0

是的,我寧願使用'$ parent.list [$ index()]'解決方法,它總是起作用,而不是再次包裝我的函數。 – Retsam 2014-10-29 18:16:22

回答

2

不,這是KO 3.0中的一個錯誤。

在< 2.3這是一個缺失的功能。因爲沒有$rawData,您無法使用包含observablez [ko.observable(1), ko.observable(2)]的數組。

在3.0 $rawData被引入,但它是越野車。其中3.1 https://github.com/knockout/knockout/pull/1206已修復。

所以這個正確的行爲如上面的鏈接問題,總結了daedalus28

$rawData應爲返回值,如果它是一個功能,而不是一個可觀察的。如果它是可觀察到的(或函數的結果是可觀察到的),應解開成$data而不是$rawData - $rawData應該保留的實際觀察到的(該函數的結果)

所以目前你的使用情況KO不支持。

所以你必須使用$parent.list[$index()]或不要直接把你的函數放入數組中。

總結他們的可觀

list: [ 
     ko.observable(function() { 
      return "foo"; 
     }), 
     ko.observable(function() { 
      return "bar"; 
     }), 
     ko.observable(function() { 
      return "hodor"; 
     }) 
    ] 

演示JSFiddle

或把他們的一些虛擬對象:

list: [ 
    {bar: function() { 
     return "foo"; 
    }}, 
    {bar: function() { 
     return "bar"; 
    }}, 
    {bar: function() { 
     return "hodor"; 
    }} 
] 

而且你寫:

<span data-bind="text: bar"></span> 

演示JSFiddle

+0

我不確定我遵循他們爲什麼應該總是爲我解開函數的邏輯,而觀察者不是;但我想我可以在你發佈的問題上接受它,如果我想。感謝你的回答! – Retsam 2014-10-29 18:24:33