Javascript 有没有一种方法可以在淘汰JS中实现主/从类型相关的观测值

Javascript 有没有一种方法可以在淘汰JS中实现主/从类型相关的观测值,javascript,knockout.js,Javascript,Knockout.js,我的模型中有两个字段具有主/从类型的关系 如果主设备更新,则从设备也应进行更新 如果从机更新,则主机不受影响 我已经通过手动订阅实现了这一点- 但是我想知道,如果没有手动绑定,我是否可以达到同样的效果。我想要它的原因是,当我破坏我的视图时,我不希望必须解除手动订阅的绑定 干杯, Peter一般来说,我认为手动订阅是解决您问题的最直接方法 但是,创建您自己的自定义observable非常容易,它封装了此功能,并在可写的DependentoServable中处理主设备和从设备的更新。它可能看起来像这

我的模型中有两个字段具有主/从类型的关系

如果主设备更新,则从设备也应进行更新

如果从机更新,则主机不受影响

我已经通过手动订阅实现了这一点-

但是我想知道,如果没有手动绑定,我是否可以达到同样的效果。我想要它的原因是,当我破坏我的视图时,我不希望必须解除手动订阅的绑定

干杯,
Peter

一般来说,我认为手动订阅是解决您问题的最直接方法

但是,创建您自己的自定义observable非常容易,它封装了此功能,并在可写的DependentoServable中处理主设备和从设备的更新。它可能看起来像这样:

function customObservable(initialValue) {
    var _source = ko.observable(initialValue),
        _local = ko.observable(initialValue),
        result = ko.dependentObservable({
            read: _source,
            write: function(newValue) {
               _source(newValue);
               _local(newValue); 
            }
        });

    result.local = _local;

    return result;
}
你会像这样使用它:

var viewModel = {
    source: customObservable("sourceValue")
};
customObservable(可以随意调用)返回一个可写的dependentObservable,它将更新您可以绑定为
源的两个值。本地值也显示为
source.local

因此,您可以在场景中使用此选项,如:

但我不确定您想如何使用此功能。如果您希望能够接受/取消对可观察对象的编辑,那么您可能希望查看自定义可观察对象

要在自定义绑定中显示处置的代码段:

        var subscription = oComboBoxModel.value.subscribe(updateBestMatchFromValue, oComboBoxModel);

        //handle disposal (if ko.cleanNode is called on the element)
        ko.utils.domNodeDisposal.addDisposeCallback(element, function(){
              subscription.dispose();
        });

一般来说,我认为手动订阅是解决您的问题的最直接的方法

但是,创建您自己的自定义observable非常容易,它封装了此功能,并在可写的DependentoServable中处理主设备和从设备的更新。它可能看起来像这样:

function customObservable(initialValue) {
    var _source = ko.observable(initialValue),
        _local = ko.observable(initialValue),
        result = ko.dependentObservable({
            read: _source,
            write: function(newValue) {
               _source(newValue);
               _local(newValue); 
            }
        });

    result.local = _local;

    return result;
}
你会像这样使用它:

var viewModel = {
    source: customObservable("sourceValue")
};
customObservable(可以随意调用)返回一个可写的dependentObservable,它将更新您可以绑定为
源的两个值。本地值也显示为
source.local

因此,您可以在场景中使用此选项,如:

但我不确定您想如何使用此功能。如果您希望能够接受/取消对可观察对象的编辑,那么您可能希望查看自定义可观察对象

要在自定义绑定中显示处置的代码段:

        var subscription = oComboBoxModel.value.subscribe(updateBestMatchFromValue, oComboBoxModel);

        //handle disposal (if ko.cleanNode is called on the element)
        ko.utils.domNodeDisposal.addDisposeCallback(element, function(){
              subscription.dispose();
        });

谢谢你的意见。在我的场景中,我无法修改原始视图模型以将可观察对象更改为自定义可观察对象。我正在开发一个组合框绑定,我希望原始视图模型需要一些技巧。我试图避免手动绑定的具体原因是,如果我手动订阅,在调用cleanNodes后,父视图模型将保留对combobox模型的引用。尽管,仔细考虑一下,这可能也会成为依赖观测值的问题……您可以使用:
ko.utils.domNodeDisposal.addDisposeCallback
在主元素上调用cleanNode时添加回调以处理订阅。在答案中添加了一个代码片段,以显示它对您的外观。感谢您的输入。在我的场景中,我无法修改原始视图模型以将可观察对象更改为自定义可观察对象。我正在开发一个组合框绑定,我希望原始视图模型需要一些技巧。我试图避免手动绑定的具体原因是,如果我手动订阅,在调用cleanNodes后,父视图模型将保留对combobox模型的引用。尽管,仔细考虑一下,这可能也会成为依赖观测值的问题……您可以使用:
ko.utils.domNodeDisposal.addDisposeCallback
在主元素上调用cleanNode时添加回调以处理订阅。在答案中添加了一个代码片段,以显示它对您的外观。