3

当父可观察对象使用 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);
}

父项的 defaultValue 属性绑定到输入控件。

我想要做的是在我更新父母的默认值时为每个孩子调用我的翻译服务。但是我对如何进行有点迷茫。

  1. 如何识别父级的“defaultValue”属性已更改?
  2. 发生这种情况时,我应该迭代父级中的子级,还是以某种方式也将其移至子级?

(注意,我的例子是从实际实现中简化的)

编辑:将此与函数一起添加到我的 defaultValue 元素中,仍然传递旧值:

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

其中 updateChildren 迭代子数组。

4

2 回答 2

2

如果您在孩子上引用父母,您应该可以做类似的事情。

parent.defaultValue.subscribe(function(newValue){
    //do something on child with newValue
});

总体思路在“扩展器” http://knockoutjs.com/documentation/extenders.html中进行了解释

于 2012-08-02T18:36:31.757 回答
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);
    });
于 2012-08-02T18:45:36.717 回答