Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.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
Javascript 敲除-将值写入ko_Javascript_Knockout.js_Knockout 2.0 - Fatal编程技术网

Javascript 敲除-将值写入ko

Javascript 敲除-将值写入ko,javascript,knockout.js,knockout-2.0,Javascript,Knockout.js,Knockout 2.0,我已经在Knockout中构建了一个非常注重数据/数字的应用程序。我当前收到错误信息: 未捕获错误:除非 指定“写入”选项。如果要读取当前值,请不要 传递任何参数 当我的自定义bindingHandler(将数字格式化为“大”形式,即123345678987)尝试回写到显示计算函数值的原始输入时,就会发生这种情况 输入元素中显示的值: self.value = ko.computed(function(){ return self.chosenAge().population; // '

我已经在Knockout中构建了一个非常注重数据/数字的应用程序。我当前收到错误信息:

未捕获错误:除非 指定“写入”选项。如果要读取当前值,请不要 传递任何参数

当我的自定义bindingHandler(将数字格式化为“大”形式,即123345678987)尝试回写到显示计算函数值的原始输入时,就会发生这种情况

输入元素中显示的值:

self.value = ko.computed(function(){
    return self.chosenAge().population; // 'fetched' from an array.
});
ko.bindingHandlers.largeNumber = {
    init: function(element, valueAccessor) {
        numberInit(element);
        var value = valueAccessor();
        var interceptor = ko.computed({
            read: function() {
                // inject number formatting
                return numeral(ko.unwrap(value)).format('0,0');
            },
            write: function(newValue) {
                // remove formatting when writing a new value
                value(numeral().unformat(newValue));
            }
        });
        // display new value in target element
        if(element.tagName.toLowerCase() == 'input' ) {
            ko.applyBindingsToNode(element, {
                value: interceptor
            });
        }
        else {
            ko.applyBindingsToNode(element, {
                text: interceptor
            }); 
        }
    }
};
绑定处理程序:

self.value = ko.computed(function(){
    return self.chosenAge().population; // 'fetched' from an array.
});
ko.bindingHandlers.largeNumber = {
    init: function(element, valueAccessor) {
        numberInit(element);
        var value = valueAccessor();
        var interceptor = ko.computed({
            read: function() {
                // inject number formatting
                return numeral(ko.unwrap(value)).format('0,0');
            },
            write: function(newValue) {
                // remove formatting when writing a new value
                value(numeral().unformat(newValue));
            }
        });
        // display new value in target element
        if(element.tagName.toLowerCase() == 'input' ) {
            ko.applyBindingsToNode(element, {
                value: interceptor
            });
        }
        else {
            ko.applyBindingsToNode(element, {
                text: interceptor
            }); 
        }
    }
};

您需要在ko.computed函数中指定一个“write”选项。请看地图。绑定处理程序与更新失败的值无关。您的计算机应该如下所示:

self.value = ko.computed(function(){
    read: function () {
        return self.chosenAge().population; // 'fetched' from an array.
    },
    write: function (value) {
        //update your self.chosenAge().population value here
    },
    owner: self
});

希望这能有所帮助。

就我个人而言,我将在
扩展器中捕获格式化的实现

定义一个扩展,用
computed
格式化程序包装可观察的数据:

ko.extenders.largeNumber = function (target, option) {

  var formatter = ko.computed( {
    read: function(){
    var formatted = target().toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    return formatted;
  },
    write: function(nv){
        var numeric = nv.replace(/,/g,""); 
        target(numeric);

        console.log("View model now contains " + target())
  }
 })
 return formatter;
};
然后创建一个使用扩展的可观察对象:(我将其包装在构造函数中)

此外,我将使我的可观察性成为表示
选择年龄的数据对象中的
总体
属性

{
  name: "Bronze",
  population: createExtendedObs(10000)
}
这不是一项要求。如果希望将总体存储在另一个可观察对象中,我将扩展器设置为通过
options
参数访问viewModel。因此,您可以通过这种方式访问另一个可观察对象。如果要计算“其他”观测值,则需要指定
write
函数(如其他答案中所述),这是问题的根源。另一个选项是订阅
chosenAge
,并设置订阅中可观察到的“其他”总体

直接使用data属性,我可以按如下方式绑定到它

<div data-bind='with: chosenAge'>  
  <input data-bind='value: population'></input>
</div>

是否确实要回写到您的
计算值?或者您想更新
填充
?基本上可以看出,输入字段中显示的值是从chosenAge数组中获取的。我正在尝试获取它,因此,如果您单击该输入元素,您可以使用
largeNumber
格式输入您自己的自定义填充。是的,我最初尝试过这一点,我遇到的问题是写回它?如果没有更多关于
chosenAge
对象的信息,我真的不能给你一个好的答案,你能用更多的信息更新你的帖子吗?我认为你的代码是不正确的,在
ko里面。computed
应该是一个对象,而不是一个函数。此外,链接已经过时,新的链接是,这甚至不是正确的javascript