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

我正在接受淘汰赛训练。(约翰·帕帕指导)。我有两个问题

  • 为什么简短描述用单引号表示
  • 我们如何能够在 “行”。shortDescription是my.Product中的一个属性,但如何 我们可以直接访问它吗?不应该是这样吗 '我的.Product.shortDescription'
  • 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 ...'""/>
    
    
    
    单引号和双引号与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绑定为其每个元素提供了上下文一样。