2012-08-02 106 views
3

當父可觀察性使用KnockoutJs更改時,如何觸發子元素的更新?Knockoutjs更新孩子,當父母的可觀察到的變化

在我的應用程序中,我正在構建一個翻譯工具。我有一個代表一些文本的原始(默認)值淘汰賽類,有翻譯兒童的集合:

function ParentObject(id, defaultValue) { 
    var self = this; 

    self.id = id; 
    self.defaultValue = ko.observable(defaultValue); 

    self.children = ko.observableArray(); 

    self.loadChildren = function() { 
     // standard code to load the children ("lazy load", as I have gobs of data) 
    } 
} 

而且孩子

function Child(id, translation, cultureCode) { 
    var self = this; 

    self.id = id; 
    self.cultureCode = cultureCode; 
    self.translation= ko.observable(translation); 
} 

父項的默認值屬性綁定到一個輸入控件。

當我更新父項的默認值時,我想要爲每個孩子調用我的翻譯服務。但我對於如何着手有點失落。

  1. 如何識別父母的「defaultValue」屬性 已更改?
  2. 當 發生時,我是否應該迭代父代中的孩子,或者以某種方式將其移動到孩子身上?

(請注意,我的例子是從真正的實現簡化)

編輯:加入這一個功能沿着我的默認值元素,還通過舊值:

data-bind=" value: defaultValue, event: {change: updateChildren}" 

哪裏updateChildren迭代子數組。

回答

2

這裏是一個工作示例: JsFiddle

function ParentObject(id, defaultValue) { 
    var self = this; 

    self.id = id; 

    self.defaultValue = ko.observable(defaultValue); 

    self.defaultValue.subscribe(function(newValue){ 
     ko.utils.arrayForEach(self.children(), function(child) { 
      alert(child.id); 
     }); 
     console.log(newValue); 
    }); 

    self.children = ko.observableArray(); 

    self.loadChildren = function() { 
     // standard code to load the children ("lazy load", as I have gobs of data) 
    } 
} 

function Child(id, translation, cultureCode) { 
    var self = this; 

    self.id = id; 
    self.cultureCode = cultureCode; 
    self.translation= ko.observable(translation); 
} 


var vm = function() { 
    var self = this; 
    self.parent = new ParentObject(1,10); 
    self.parent.children.push(new Child(1,"A","1A")); 
    self.parent.children.push(new Child(2,"B","2B")); 
    self.parent.children.push(new Child(3,"C","3C")); 
} 

var viewModel = new vm(); 

ko.applyBindings(viewModel); 

您可以使用訂閱功能收聽觀察的變化:

self.defaultValue.subscribe(function(newValue){ 
     ko.utils.arrayForEach(self.children(), function(child) { 
      alert(child.id); 
     }); 
     console.log(newValue); 
    }); 
+0

我明白你要去那裏了,我喜歡小提琴的結果。我只是沒有看到我的應用程序中訂閱的事件觸發。 – reallyJim 2012-08-02 20:01:05

相關問題