Javascript 使用自定义绑定KnockoutJS更新ViewModel

Javascript 使用自定义绑定KnockoutJS更新ViewModel,javascript,php,jquery,html,knockout.js,Javascript,Php,Jquery,Html,Knockout.js,所以我有一个水疗开发使用 该示例在类似以下的表格中显示Todo列表 选择 标题 艺术家 现在我要做的是,只要我更改标题文本,我就会尝试更改艺术家文本,因为我已经创建了一个自定义绑定更新标题,并将其与文本框相关联,如表所示。其定义如下: ko.bindingHandlers.updateOnTitle = { init:function(element,valueAccessor,allBindings,viewModel,bindingContext) {

所以我有一个水疗开发使用

该示例在类似以下的表格中显示Todo列表


选择
标题
艺术家
现在我要做的是,只要我更改
标题
文本,我就会尝试更改
艺术家
文本,因为我已经创建了一个自定义绑定
更新标题
,并将其与文本框相关联,如表所示。其定义如下:

ko.bindingHandlers.updateOnTitle = {
    init:function(element,valueAccessor,allBindings,viewModel,bindingContext)
    {
           $(element).blur(function (evt) {
              //Here I am trying to update the artist property based on title
              bindingContext.$data.title("Title goes here");
              bindingContext.$data.artist("New Artist Name Here");
           }
    }
上表未反映这些变化。这两种性质都是可以观察到的。
我想知道我到底遗漏了什么?

我不妨把我的评论变成一个答案。我认为绑定处理程序更适合作为解决问题的一般方法,避免绑定依赖于特定的ViewModel(您的绑定指的是“艺术家”和“标题”)是值得的。A可能更适合这项任务

假设以下视图:

输入
标题:
艺术家:
只读版本 标题:
艺术家:
请注意,第一个输入绑定到
titleEditing
,即计算出的可观测值。可以使用以下属性定义ViewModel:

function ViewModel() {
    var self = this;

    var _title = ko.observable('my title');
    self.title = ko.computed({
        read: _title,
        write: function(newval) {
            _title(newval);
            self.artist('New Artist Name Here');
        }
    });

    self.artist = ko.observable('john doe');
};
现在,如果您更新第一个输入,标题将更改,艺术家将重置


请参阅演示。

也许可以解释一下为什么需要同时更改艺术家和标题,这有助于理解所需的功能。。我要求从一个API的细节和基于标题的API也返回艺术家的名字,所以这就是为什么我想改变两个嘿嘿!请在问题中添加更多的代码来帮助我们解决这个问题,并可能添加repu。另一方面,对于这种事情,a可能更方便,特别是因为前面提到的bindingHandler依赖于您的ViewModel,这不是最方便的设计。我认为您是正确的。computed observable是处理此场景的方法。我想知道的唯一一件事是如何在write:函数中传递艺术家名称,正如我在一篇评论中提到的,我正在使用一个API,当标题传递时返回艺术家名称。如果你想回答这个问题,你真的应该包括(代表性的模拟)使用该API,无论是在这里还是在一个新的SO问题中。通常情况下,我只需将
artist
值的范围设置为正确的闭包,这样我就不必传递它(如我的示例中所示),看起来更精简。