Knockout.js 为什么选项文本在单引号中?击倒
我正在接受淘汰赛训练。(约翰·帕帕指导)。我有两个问题Knockout.js 为什么选项文本在单引号中?击倒,knockout.js,Knockout.js,我正在接受淘汰赛训练。(约翰·帕帕指导)。我有两个问题 为什么简短描述用单引号表示 我们如何能够在 “行”。shortDescription是my.Product中的一个属性,但如何 我们可以直接访问它吗?不应该是这样吗 '我的.Product.shortDescription' JavaScript: my.Product=function(){ this.id=ko.observable(); this.salePrice=ko.observable();
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 ...'""/>
单引号和双引号与Javascript相同,但在数据绑定中使用单引号是因为HTML属性需要双引号
数据绑定通常可以通过名称引用模型的任何成员(这是传递给ko.applyBindings的内容)。在某些上下文中(在foreach
和带有
绑定的中),您将引用子成员,要引用模型的成员,必须在引用之前加上$root
更新:对不起,我读代码时很粗心。“shortDescription”是要用作OptionText的成员的名称,它与作为select的选项绑定而给出的内容相关(在本例中为$parent.products)。关于“为什么shortDescription使用单引号”
shortDescription是单引号,因为当前范围是行项目
,而不是产品
。Knockout获取未加修饰的值,如product
,并在当前范围内查找它们以获得值。如果它看到shortDescription
,它将在行项目上查找此。shortDescription
,而不是在产品上。它将继续使用此值(null
)作为产品
的属性查找
Knockout对选项text
执行属性查找,因为正常的产品.shortDescription
语法要求您首先将变量(例如产品
)绑定到每个产品
。实际上,您所做的是提供一个函数,用于从每个选项中提取选项text
,如果您只想给出属性名称,则Knockout提供了一个快捷方式。事实上,您可以自由地提供一个函数,如。我同意您所说的“数据绑定通常可以通过名称引用模型的任何成员”,但my.vm上没有shortdescirption。在这个示例中,绑定发生在ko.applyBindings(my.vm)中;i、 请注意,我更新了我的答案。很清楚shortDescription是如何被引用的吗?感谢您的更新。所以我从您那里了解到,当我使用“foreach:lines”上下文时,它会更改lines observableArray中的每个行项目。但是,当我使用时,上下文会再次更改(对于特定的select元素)基于我们用来填充其内容的对象。希望这种理解是正确的。特别是,optionsText和optionsValue的计算方法就好像options绑定为其每个元素提供了上下文一样。