我正在接受Knockout培训。(John Papa教程)。我有两个问题
JavaScript的:
my.Product=function(){
this.id=ko.observable();
this.salePrice=ko.observable();
this.photo=ko.observable();
this.shortDescription=ko.observable();
this.photoUrl=ko.computed(function(){
return photoPath+this.photo;
});
};
my.LineItem=function(){
var self=this;
self.product=ko.observable();
self.quantity=ko.observable(1);
self.extendedPrice=ko.computed(function(){
return self.product() ? self.product().salePrice() * parseInt("0" + self.quantity(), 10) : 0;
});
};
my.vm={
products:ko.observableArray([]),
lines:ko.observableArray([new my.LineItem()])
};
HTML代码
<div data-bind="foreach:lines">
<select data-bind="options:$parent.products, value:product,optionsText:'shortDescription', optionsCaption:'Select a product ...'""/>
答案 0 :(得分:1)
单引号和双引号与Javascript相同,但您在data-bind中使用single,因为HTML属性需要双引号。
数据绑定通常可以通过名称引用到模型的任何成员(传递给ko.applyBindings的内容)。在某些上下文中(在foreach
和with
绑定内),您将引用子成员,并且要引用模型的成员,您必须在引用前加上$ root。
更新:对不起,我不小心读了代码。 'shortDescription'是要用作optionsText的成员的名称,它与select的选项绑定相关(在本例中为$ parent.products)。
答案 1 :(得分:1)
关于“为什么短引号用单引号”......
shortDescription是单引号,因为当前范围是LineItem
,而不是Product
。 Knockout采用像product
这样的未经修饰的值,并在当前范围内查找它们以获取值。如果它看到shortDescription
,则会在this.shortDescription
上找到LineItem
,而不是Product
。它将继续使用此值(null
)作为Product
上的属性查找。
Knockout对optionsText
执行属性查找,因为正常的theProduct.shortDescription
语法会要求您首先将变量(例如theProduct
)绑定到每个products
。实际上,你正在做的是提供一个函数,用于从每个optionsText
中提取options
,如果你想给一个属性名称,Knockout提供了一个快捷方式。事实上,您可以自由地提供功能,例如Setting Referencing。