如何从knockout.js中的组件订阅父模型中的可观察对象

dw1jzc5e  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(165)

我正在处理一些使用Knockout.js的遗留代码,我必须添加一个新功能,我在某个点上有点迷失。我不能分享实际代码,所以我将使用一些伪代码来描述我的问题
假设我有一些示例View模型

function ViewModel(params) 
  {
    this.questions = params.questions;
    this.clear = ko.observable();
  }

它从外部源获取一个问题数组,但它不是一个可观察数组。

ViewModel.prototype.add = function()
{
  if (this.clear === 'No'){
    this.clear('Yes');
   } else{
    this.clear('No');
   }
}

我有一个已注册的组件

ko.components.register('customComponent', {
  viewModel: function(params) {
    this.clearInComponent = ko.observable(params.clear);
  },
  template: '<div data-bind="text: clearInComponent "></div>'
});

现在,在我的HTML中,我有一个按钮,单击该按钮会将某个值设置为cthe clear()observable,还有一个组件,我将从View模型向该组件传递参数

<button data-bind="click: add"></button>

<questionnaire params="questions: questions, clear:clear"></questionnaire>

现在,每当父视图模型中clear()的值发生变化时,它也会反映在组件中,这是预期的。我想要实现的是设置对clearInComponent的订阅,这样当父视图模型中可观察到的clear()发生变化时,我就能够捕获事件并做一些额外的事情。我试图在组件视图模型中添加对clearInComponent的订阅,但它不起作用。

this.clearInComponent.subscribe = function(newValue){
   // do stuff
}

我的问题是,如果这是可能的,我怎么能做到呢?提前感谢。

dxxyhpgq

dxxyhpgq1#

我想这可能就是问题所在:

this.clearInComponent = ko.observable(params.clear);

由于params.clear本身就是一个可观测值,所以你基本上是将一个可观测值 Package 在另一个可观测值中,使得订阅this.clearInComponent变得无用,因为它的值永远不会发生变化。
相反,只需直接使用params.clear

this.clearInComponent = params.clear;

this.clearInComponent.subscribe(function (newValue) {
    // this should work fine...
    console.log(newValue);
});

相关问题