首页 > 解决方案 > 从子更改触发父 ViewModel 事件

问题描述

当子视图模型上的可观察对象发生变化时,有没有办法允许在父视图模型上触发事件?这是我正在谈论的一个简单示例:

HTML:

<input data-bind="value: child().childValue"/>
<span data-bind="text: child().childValue"/>

JavaScript:

<script>
var viewModel = function(){
   var self = this;
    self.child = ko.observable(new childViewModel());
  self.child.subscribe(function(evt){
    console.log("parent updated" + evt);  
  });
}

var childViewModel = function(){
    var self = this;
  self.childValue = ko.observable("");
    self.childValue.subscribe(function(evt){
    console.log("child updated - " + evt);  
  });
}

ko.applyBindings(viewModel);
</script>

上例中,仅触发了 childViewModel 中的 childValue 订阅。你能把这个事件强加给父母吗?

标签: knockout.jsknockout-3.4

解决方案


我找到了一个非常简单的解决方案,您可以创建一个从序列化的孩子绑定到 JSON 的计算。当 JSON 更改时,将触发该订阅):

    <script>
    var viewModel = function(){
       var self = this;
        self.child = ko.observable(new childViewModel());
      
        ko.computed(function () { return ko.toJSON(self.child()) }).subscribe(function () {
        console.log("parent updated");
        });
    
    }
    
    var childViewModel = function(){
    var self = this;
    self.childValue = ko.observable("");
    self.childValue.subscribe(function(evt){
    console.log("child updated - " + evt);  
  });
}
    
    ko.applyBindings(viewModel);
    </script>

推荐阅读