2012-09-04 48 views
0

是否可以在foreach $ data變量上使用ko.computed write函數?

<!-- ko foreach: activeAttributes.optionsSplitted --> 
    <input type="text" data-bind="value: $data"> 
<!-- /ko --> 


vm.activeAttributes.optionsSplitted = ko.computed({ 
    read: function(){ 
     return vm.activeAttributes().options().split("-*!*-");  
    }, 
    write: function(){ 
     alert("changed"); 
    } 
}); 
+0

我不知道,你告訴我們。你自己嘗試過嗎?它是否按預期工作?你期望發生什麼? –

+0

我當時除了編輯輸入文本框時,應該調用寫入函數並提示警報,但這不會發生。 –

回答

2

事情是,您的計算observable只檢測數組上的更改activeAttributes.optionsSplitted。文本框綁定到單個項目,因爲您從未實際更改activeAttributes.optionsSplitted的值,因此不會發出警報。

如果你想能夠做到這一點,你有幾個選項。

將您的輸入綁定到change事件,以便您可以在輸入中的值發生更改時執行所需操作。

<input type="text" data-bind="value: $data, event: { change: $root.changed }"> 

fiddle


或者,您也可以在值映射到包含觀察到的性能和執行的檢查存在的對象。您無法檢測對象本身的更改(任何更改都將是替換),因此您必須將該值映射到具有可寫計算屬性的對象。

self.activeAttributes.optionsSplitted = ko.computed(function(){ 
    var options = self.activeAttributes().options().split("-*!*-"); 
    return ko.utils.arrayMap(options, function (option) { 
     // does not work 
     //return ko.computed({ 
     // read: function() { return option; }, 
     // write: function (value) { alert('changed'); } 
     //}); 
     return { 
      value: ko.computed({ 
       read: function() { return option; }, 
       write: function (value) { alert('changed'); } 
      }) 
     }; 
    }); 
}); 

然後綁定到屬性。

<input type="text" data-bind="value: value"> 

fiddle


這些都不是你唯一的當然選擇,可能有其他的事情,你可以在這裏做的,但這些都是浮現在腦海中。

+1

你已經給出了很好的解決方案。我想不出好多了。 –