BreezeJS不会使用KnockoutJS绑定自动解析保存为字符串的数字

时间:2012-12-19 11:26:52

标签: validation knockout.js breeze

我使用以下代码使用Breezejs查询了我的数据库:

viewModel = {
    products = ko.observableArray([])
};

var manager = new entityModel.EntityManager('/api/Products');
manager.executeQuery(query)
       .then(function (data) {
           viewModel.products.removeAll();
           viewModel.products(data.results);
       });

但是,产品行包含使用data-bind属性连接到我的页面的数字属性,例如Quantity。通过manager.saveChanges()保存模型时,我收到验证错误。这是因为KnockoutJS将编辑后的数字保存为字符串。

解决此问题的推荐方法是什么?

3 个答案:

答案 0 :(得分:1)

一种选择是创建一个CustomBinding。

我用它来表示小数:

ko.bindingHandlers.decimal = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        $(element).blur(function () {
            var value = valueAccessor();
            var valor = Globalize.parseFloat($(element).val());
            if (ko.isWriteableObservable(value)) {
                value(valor);
                ko.bindingHandlers.decimal.update(element, valueAccessor);
            }
        });
    },
    update: function (element, valueAccessor, allBindingsAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        $(element).val(Globalize.format(value, "n2"));
    }
};

答案 1 :(得分:1)

截至breeze v 0.80.2,现在支持此功能。 (以及自定义类型强制的能力)

答案 2 :(得分:0)

这是一个很好的问题。

目前,微风不会尝试强制类型,但是......

我们已经讨论过让Breeze自动尝试将set操作中使用的任何值强制转换为正在设置的属性的数据类型(如breeze元数据中所定义)。这将发生在所有结合文库中(即角,骨架等)以及敲除。

请随意将此添加到微风User Voice。我们非常重视这些提交。