【问题标题】:Knockout custom binding doesn't update the computed function淘汰赛自定义绑定不更新计算函数
【发布时间】:2014-02-24 07:18:27
【问题描述】:

我有一个 html 可编辑字段的自定义绑定..

我现在将其更改为使用另一个自定义绑定 (HtmlValue),因为 EditableText 在更新值时出错(两个自定义绑定都包含在 jsfiddle 中)。

有人知道如何解决这个问题吗?

这是不更新值的代码:

ko.bindingHandlers.htmlValue = {
init: function (element, valueAccessor, allBindingsAccessor) {
    ko.utils.registerEventHandler(element, "keyup", function () {
        var modelValue = valueAccessor();
        var elementValue = element.innerHTML;
        if (ko.isWriteableObservable(modelValue)) {
            modelValue(elementValue);

        }
        else { //handle non-observable one-way binding
            var allBindings = allBindingsAccessor();
            if (allBindings['_ko_property_writers'] && allBindings['_ko_property_writers'].htmlValue) allBindings['_ko_property_writers'].htmlValue(elementValue);
        }
    }
                                 )
},
update: function (element, valueAccessor) {
    var value = ko.utils.unwrapObservable(valueAccessor()) || "";
    if (element.innerHTML !== value) {
        element.innerHTML = value;
    }
}
}; 

您可以在这里试用:http://jsfiddle.net/DMf8r/

【问题讨论】:

    标签: javascript jquery knockout.js


    【解决方案1】:

    视图模型的构建方式和绑定本身存在很多问题...

    • 计算的tax_total 应该在lines 之后声明,因为它访问lines,并且Knockout 在计算创建后立即执行tax_total
    • this 需要传递到计算中,以便计算中的this 是视图模型
    • elem 需要在$.each() 调用中定义
    • 要在 $.each() 中循环底层数组,您需要使用 this.lines() 而不是 this.lines
    • 行内的值必须是可观察的,否则不会通知计算的更改。
    • span 正在使用value 绑定,它应该是text

    可能还有更多问题,但很难跟踪所有更改是什么......

    this.lines = ko.observableArray([
        {  unit_price: ko.observable(5.0), tax_rate: ko.observable(21.00) },
        {  unit_price: ko.observable(5.0), tax_rate: ko.observable(21.00) }]);
    
    this.add_line = function () {
        this.lines.push({ unit_price: ko.observable(5.0), tax_rate: ko.observable(21.00) });
    }.bind(this);
    
    this.tax_total = ko.computed(function () {
        var total = 0; //this.subtotal()
        $.each(this.lines(), function (index, elem) {
            total += (elem.unit_price() * (elem.tax_rate() / 100));
        });
        return total;
    }, this);
    

    <span data-bind="text: tax_total">1.02</span>
    

    小提琴:http://jsfiddle.net/DMf8r/1/

    【讨论】:

    • 行内的值需要是可观察的,否则计算将不会被通知更改是我寻找的问题,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2014-10-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多