2015-01-04 51 views
1

我只是学习淘汰赛,遇到的教程与清单工作。淘汰赛:ko可观察没有默认值

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?

+0

如果空字符串做了你所需要的,那么这是正确的方法... – dandavis

回答

3

当然你也可以intialize你观察到的,以null

self.meal = ko.observable(null); 

还是要undefined

self.meal = ko.observable(); 

然而,在这种情况下,你必须处理的情况下,当meal如果事实上nullundefined,因为当你编写类似self.meal().price;的东西时,它会抛出一个异常,因为你试图访问一个属性“not兴“

所以你需要修复的formattedPrice计算:

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

和计算机来检查self.meal()情况totalSurcharge

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; 
}); 

演示JSFiddle

注意:它正在处理空字符串(因为空字符串是一个对象,所以它是有效的访问它们的属性,如self.meal().price但是所有这些将返回未定义),因此它不是一个合适的解决方案。

+0

“”.price是未定义的,它是错误的,在OP的代码中触发“无”字符串。 – dandavis

+0

@nemesv你真棒。正是我在找的东西。 – vumaasha