knockout:没有默认值的ko observable

时间:2015-01-04 17:12:19

标签: javascript knockout.js

我正在学习淘汰赛,遇到了使用列表的教程。

function SeatReservation(name, initialMeal) {
    var self = this;
    self.name = name;
    self.meal = ko.observable(initialMeal);

    self.formattedPrice = ko.computed(function() {
        var price = self.meal().price;
        return price ? "$" + price.toFixed(2) : "None";        
    });
}

在本教程中,此代码定义了一个可观察的用餐,这将是下拉选择中选择的选项。如果我没有默认值,例如我想使用无线电组而不是选择。我希望能够创建一个没有任何默认值的observable。我尝试使用空字符串作为默认值,然后它可以正常工作

self.meal = ko.observable("");

如果我尝试将null作为默认值,则甚至不会出现选择选项。

self.meal = ko.observable(null); // not working

创建没有默认值的observable的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

当然,您可以使用

将您的观察结果初始化为null
 self.meal = ko.observable(null);

或{/ 1}}

undefined

但是,在这种情况下,您必须在 self.meal = ko.observable(); 实际mealnull时处理此案例,因为当您写出类似 undefined的内容时,它会抛出异常是因为您尝试访问"没有"

的属性

所以你需要修复self.meal().price;计算:

formattedPrice

计算self.formattedPrice = ko.computed(function() { if (!self.meal()) return "None"; var price = self.meal().price; return price ? "$" + price.toFixed(2) : "None"; }); 以检查totalSurcharge案例:

self.meal()

演示JSFiddle

注意:它是偶然使用空字符串(因为空字符串是一个对象,所以访问它们的属性是有效的,如self.totalSurcharge = ko.computed(function() { var total = 0; for (var i = 0; i < self.seats().length; i++) { if (self.seats()[i].meal()) total += self.seats()[i].meal().price; } return total; }); 但是所有这些都将返回undefined)所以它不是适当的解决方案。