Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js 如何在自定义绑定中更新可观察对象?_Knockout.js - Fatal编程技术网

Knockout.js 如何在自定义绑定中更新可观察对象?

Knockout.js 如何在自定义绑定中更新可观察对象?,knockout.js,Knockout.js,我有一个绑定处理程序,里面有简单的逻辑,我将更新可观察对象,以便它在视图中更新自己 这是一个示例案例,其中所有内容都按预期工作 我的观点: <input data-bind="value: name" /> <hr/> <div data-bind="fadeInText: name"></div> ko.bindingHandlers.fadeInText = { update: function(element, valueAcces

我有一个绑定处理程序,里面有简单的逻辑,我将更新可观察对象,以便它在视图中更新自己

这是一个示例案例,其中所有内容都按预期工作

我的观点:

<input data-bind="value: name" />
<hr/>
<div data-bind="fadeInText: name"></div>
ko.bindingHandlers.fadeInText = {
    update: function(element, valueAccessor) {
        ko.bindingHandlers.text.update(element,valueAccessor);//text becoz its binded to div
    } 
};
<input data-bind="value: name" />
<hr/>
<input type="text" data-bind="fadeInText: name" />
<div data-bind="text:ko.toJSON($data)"></div>
ko.bindingHandlers.fadeInText = {
    update: function(element, valueAccessor) {
            var value = valueAccessor();
    ko.bindingHandlers.value.update(element,valueAccessor);
    $(element).change(function () {
            value($(element).fadeInText('get'));
        });
    } 
};
在这里,我试图做一些类似的事情(如下),我被困在这里
更新一个可观察的

我的观点:

<input data-bind="value: name" />
<hr/>
<div data-bind="fadeInText: name"></div>
ko.bindingHandlers.fadeInText = {
    update: function(element, valueAccessor) {
        ko.bindingHandlers.text.update(element,valueAccessor);//text becoz its binded to div
    } 
};
<input data-bind="value: name" />
<hr/>
<input type="text" data-bind="fadeInText: name" />
<div data-bind="text:ko.toJSON($data)"></div>
ko.bindingHandlers.fadeInText = {
    update: function(element, valueAccessor) {
            var value = valueAccessor();
    ko.bindingHandlers.value.update(element,valueAccessor);
    $(element).change(function () {
            value($(element).fadeInText('get'));
        });
    } 
};
在这个给定的场景中,当我更新textbox-1中的值时,有两个textbox,然后textbox-2值被更新

但当我尝试更新textbox-2的值时,没有任何东西得到更新,我感觉非常接近,但现在我无法破解它

选中chrome控制台我看到
未捕获类型错误:未定义不是函数
,但绑定中存在
fadeInText

更新:

我尝试了
allBindingsAccessor().fadeInText()
每次都会得到旧值,而不是新输入的值

小提琴手

有些事情是用同样的方法做的,但它起作用了


这方面的任何帮助都非常有用。

如果要包装
绑定,还必须调用其
init

ko.bindingHandlers.fadeInText = {
    init: function(element, valueAccessor, allBindings) {
        ko.bindingHandlers.value.init(element,valueAccessor, allBindings);
    },
    update: function(element, valueAccessor) {  
       var value = valueAccessor();
       ko.bindingHandlers.value.update(element,valueAccessor);
    } 
};
工作

原因如下:当
名称
可观察到的更改时,会自动调用
fadeInText
更新处理程序-在
更新
处理程序中访问该处理程序将其注册。因此,双向绑定的一半——可观察到输入字段——起作用

对于双向绑定的另一半-输入字段为可观察-您需要调用
value
绑定的
init
处理程序,因为在那里
value
设置事件处理程序,以便在输入字段更改时通知它


粗略地说,您可以使用自定义绑定的
init
部分在HTML元素发生更改时更改可观察内容(例如通过附加事件处理程序),使用
update
部分在可观察内容发生更改时更改HTML元素。

您是否尝试过使用
值更新可观察内容(element.value);
?请参阅
是的
看起来这就是我在这里缺少的部分
haim770
。我尝试了element.val(),$(element.val(),但是您是如何得到element.value的?任何地方都有文档记录。因为
元素
参数是传递的本机
HTMLInputElement
),它提供了
value
属性。但是,您必须意识到,每次可观察到的更改都会绑定
change
事件,这将导致对处理程序进行多次计算。您最好将
change
绑定到绑定处理程序
init
函数。此外,
value(this.value);
也可以工作(因为jQuery会自动将元素作为回调函数上下文应用)。我同意您的看法,并且
Haim770
我需要在
init
+1中进行任何类型的更改工作,以获得最佳提示。