Knockoutjs在父级的可观察变化时更新子级

时间:2012-08-02 17:33:37

标签: javascript mvvm knockout.js

当使用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. 我应该在那里迭代父母中的孩子 发生了,或以某种方式将其移动到孩子身上?
  3. (注意,我的例子是从实际实现中简化而来)

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

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

    其中updateChildren迭代子数组。

2 个答案:

答案 0 :(得分:2)

如果您在孩子身上提到父母的提法,您应该可以做类似的事情。

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

“扩展器”http://knockoutjs.com/documentation/extenders.html

中解释了一般概念

答案 1 :(得分: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);

您可以使用subscribe函数来监听可观察的更改:

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