2013-11-01 97 views
0

我有一個包含類似下面的人可觀察一個observableArray fieldChoices{ name: ko.observable('new choice') }可觀察通知家長ObservableArray

我想要得到的觀測量,通知其必須通知另一計算的ObservableArray。

我綁定他們是這樣的:

<div data-bind="foreach: $parent.fieldChoices"> 
    <div> 
     <i class="icon-caret-right"></i> 
     <input type="text" class="span8" data-bind="value: name(), test: name()" /> 
     <i class="icon-arrow-up" data-bind="click: $parentContext.$parent.shiftChoiceUp, visible: $index() !== 0"></i> 
     <i class="icon-arrow-down" data-bind="click: $parentContext.$parent.shiftChoiceDown, visible: $index() !== ($parentContext.$parent.fieldChoices().length - 1)"></i> 
     <i class="icon-remove" data-bind="click: $parentContext.$parent.removeChoice, visible: $parentContext.$parent.fieldChoices().length > 2"></i> 
    </div> 
</div> 

我不能得到的觀測通知觀察到陣列的name值更改時。我試圖添加一個自定義綁定test: name()並從那裏通知。問題在於,更改值時綁定不會更新。

我該如何得到這個工作?

編輯:即使有類似的問題,我試圖用自定義綁定來解決這個問題。我無法爲這種方法找到任何解決方案。

回答

1

這個問題對我來說沒有多大意義,因爲默認情況下你描述的是作品(當值發生變化時,觀察者通知其訂閱者)。你可以爲你的observable創建一個擴展器,如果你願意,它可以明確地通知你的observableArray,但是你可能不想通知observableArray該observable改變(因爲它不會通知任何其他人,因爲它的hasn 「T改變),你可能只想做一些常見的功能 -

創建一個可觀察的陣列 -

var myArray = ko.observableArray(); 

註冊一個擴展 -

ko.extenders.trackChildChanges = function (target, value) { 
    target.subscribe(function() { 
     // Do some notification 
    }); 
    return target; 
}; 

然後創建您的觀測和擴展它們 -

function child(object) { 
    var self = this; 
    self.Id = ko.observable(id).extend({trackChildChanges: true}); 
    self.Name = ko.observable(name)extend({trackChildChanges: true}); 
} 

var regArray = [{ id: 1, name: 'Bill'}, {id: 2, name: 'John'}]; 

$.each(regArray, function(index, item) { 
    myArray.push(new child(item)); 
}); 
+0

我的主要目標是當observable的值發生變化時,讓'calculate'重新評估。我認爲有一種方法可以在定製綁定中的值發生更改時從訂閱中獲取訂閱,並從那裏強制「計算」進行重新評估。但我會用擴展因子去解決它,因爲我應該解決它。 – razvanz

+0

@razvan所有你需要做的只是在計算機上創建一個write:函數並從該擴展器寫入它...... –

0

你fieldChoices(觀察到的數組)時添加和數組,而不是當項目發生變化值拍攝的內容得到更新。我建議你訂閱數組中的每個項目。

var thingsToDoWhenAnItemsNamePropertyChanges = function(NewValue){ 
    alert('An items name property change to '+NewValue); 
} 
var arr = fieldChoices(); 
for(var i=0, cnt=arr.length;i<cnt;i++){ 
    var item = arr[i]; 
    var nm = item && item.name; 
    if(typeof(nm.subscribe) === 'function')nm.subscribe(thingsToDoWhenAnItemsNamePropertyChanges); 
} 

或者,如果你已經遍歷項目,而它們裝入fieldChoices那麼你可以訂閱到每個對象的name屬性即可。