为什么optionsText在单引号中?昏死

时间:2015-05-30 02:13:45

标签: knockout.js

我正在接受Knockout培训。(John Papa教程)。我有两个问题

  1. 为什么shortDescription用单引号
  2. 我们如何才能访问' shortDescription'在...的范围内 '行' .shortDescription是my.Product中的一个属性,但是如何 我们能直接访问吗?不应该这样 ' my.Product.shortDescription'
  3. 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 ...'""/>
    

2 个答案:

答案 0 :(得分:1)

单引号和双引号与Javascript相同,但您在data-bind中使用single,因为HTML属性需要双引号。

数据绑定通常可以通过名称引用到模型的任何成员(传递给ko.applyBindings的内容)。在某些上下文中(在foreachwith绑定内),您将引用子成员,并且要引用模型的成员,您必须在引用前加上$ 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