Knockout.js 我应该在哪里使用括号和敲除计算数组

Knockout.js 我应该在哪里使用括号和敲除计算数组,knockout.js,Knockout.js,我将选项绑定和计算绑定结合在一起,并在Firebug控制台中得到错误: TypeError:this.selectedCountryNeverNull未定义 这是ViewModel的相关部分: // Constructor for an object with two properties var Country = function (name, population) { this.countryName = name; this.countr

我将选项绑定和计算绑定结合在一起,并在Firebug控制台中得到错误:

TypeError:this.selectedCountryNeverNull未定义

这是ViewModel的相关部分:

    // Constructor for an object with two properties
    var Country = function (name, population) {
        this.countryName = name;
        this.countryPopulation = population;
    };

    var viewModel = {
        availableCountries: ko.observableArray([
            new Country("UK", 65000000),
            new Country("USA", 320000000),
            new Country("Sweden", 29000000)
        ]),
        selectedCountry: ko.observable(), // Nothing selected by default
        selectedCountryNeverNull: ko.observable(), // has default
        selectedCountryDesc: ko.computed(function () { return '*' + this.selectedCountryNeverNull.countryName + '*'; }, this)
    };
这是选择:

    <select data-bind="options: availableCountries,
                   optionsText: 'countryName',
                   value: selectedCountryNeverNull"></select>

我省略了
选项caption:
,因此第一个数组元素是默认值,并且该值从不为null

Firebug说错误在
ko.computed
行中,我尝试在这里和那里添加
()
括号,但没有效果

我想做更大的
ko.computed
的东西,但是在这个例子的扩展中,我把问题从淘汰网站上分离出来了


感谢您提供帮助,帮助我们理解括号中的一般问题和我的特殊问题。

我发现您的代码有三个问题:

  • 在您的
    ko中。computed
    指的是
    窗口
    ,而不是
    视图模型
  • select
    绑定在
    applyBindings
    时设置其值,因此在短时间内,
    selectedCountryNeverNull
    实际上是未定义的。这意味着您必须手动将其设置为默认值,或检查computed中的错误值
  • 在computed中,您需要使用
    ()
    获取
    selectedCountryNeverNull
    的值并创建依赖项
  • 关于如何修复这三个问题的示例:

  • 使用构造函数和
    new
    关键字来管理
  • 默认为计算中的空对象(
    |{}
  • 调用计算(
    ()
    )中的可观察对象
  • //具有两个属性的对象的构造函数
    变量国家=功能(名称、人口){
    this.countryName=名称;
    this.countryPopulation=人口;
    };
    var ViewModel=函数(){
    this.availableCountries=ko.observableArray([
    新国家(“英国”,65000000),
    新国家(“美国”,32000000),
    新国家(“瑞典”,29000000)
    ]);
    this.selectedCountry=ko.observable();//默认情况下未选择任何内容
    this.selectedCountryNeverNull=ko.observable();//具有默认值
    this.selectedCountryDesc=ko.computed(函数(){
    返回“*”+(this.selectedCountryNeverNull()| |{}).countryName+“*”;
    },这个);
    };
    应用绑定(新的ViewModel())
    
    
    
    选择:
    我发现您的代码有三个问题:

  • 在您的
    ko中。computed
    指的是
    窗口
    ,而不是
    视图模型
  • select
    绑定在
    applyBindings
    时设置其值,因此在短时间内,
    selectedCountryNeverNull
    实际上是未定义的。这意味着您必须手动将其设置为默认值,或检查computed中的错误值
  • 在computed中,您需要使用
    ()
    获取
    selectedCountryNeverNull
    的值并创建依赖项
  • 关于如何修复这三个问题的示例:

  • 使用构造函数和
    new
    关键字来管理
  • 默认为计算中的空对象(
    |{}
  • 调用计算(
    ()
    )中的可观察对象
  • //具有两个属性的对象的构造函数
    变量国家=功能(名称、人口){
    this.countryName=名称;
    this.countryPopulation=人口;
    };
    var ViewModel=函数(){
    this.availableCountries=ko.observableArray([
    新国家(“英国”,65000000),
    新国家(“美国”,32000000),
    新国家(“瑞典”,29000000)
    ]);
    this.selectedCountry=ko.observable();//默认情况下未选择任何内容
    this.selectedCountryNeverNull=ko.observable();//具有默认值
    this.selectedCountryDesc=ko.computed(函数(){
    返回“*”+(this.selectedCountryNeverNull()| |{}).countryName+“*”;
    },这个);
    };
    应用绑定(新的ViewModel())
    
    
    
    选择:
    这听起来像是
    这个
    上下文的组合,当使用击倒和偏执时,它可以将您包围在圆圈中。。在viewmodel中执行
    var self=this行开始并使用
    self
    代替
    。另外,observable、observablearray和computed都是函数,因此在引用它们时请插入paranthes
    return'*'+this.selectedCountryNeverNull().countryName+'*'
    @jnevil您的意思是我应该从
    var viewModel
    转换为
    function viewModel
    ?否。我的意思是为
    创建一个变量,以便在您的计算模型中向下引用。请看描述使用
    var self=this
    以避免错误指向错误内容的惯例的答案。@jnevil好的指针,我一定会研究它们!这听起来像是
    这个
    上下文的组合,当你使用击倒和偏执时,它会把你圈起来。。在viewmodel中执行
    var self=this行开始并使用
    self
    代替
    。另外,observable、observablearray和computed都是函数,因此在引用它们时请插入paranthes
    return'*'+this.selectedCountryNeverNull().countryName+'*'
    @jnevil您的意思是我应该从
    var viewModel
    转换为
    function viewModel
    ?否。我的意思是为
    创建一个变量,以便在您的计算模型中向下引用。请看描述使用
    var self=this
    以避免错误指向错误内容的惯例的答案。@jnevil好的指针,我一定会研究它们!在将
    var viewModel=function
    转换为
    function viewModel(){…
    之后,我得到了你的答案,这基本上是一样的,但是你的代码顺序很重要