Knockout.js 我应该在哪里使用括号和敲除计算数组
我将选项绑定和计算绑定结合在一起,并在Firebug控制台中得到错误: TypeError:this.selectedCountryNeverNull未定义 这是ViewModel的相关部分: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
// 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中的错误值()
获取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都是函数,因此在引用它们时请插入paranthesreturn'*'+this.selectedCountryNeverNull().countryName+'*'
@jnevil您的意思是我应该从var viewModel
转换为function viewModel
?否。我的意思是为此
创建一个变量,以便在您的计算模型中向下引用。请看描述使用var self=this
以避免错误指向错误内容的惯例的答案。@jnevil好的指针,我一定会研究它们!这听起来像是这个
上下文的组合,当你使用击倒和偏执时,它会把你圈起来。。在viewmodel中执行var self=this代码>行开始并使用self
代替此
。另外,observable、observablearray和computed都是函数,因此在引用它们时请插入paranthesreturn'*'+this.selectedCountryNeverNull().countryName+'*'
@jnevil您的意思是我应该从var viewModel
转换为function viewModel
?否。我的意思是为此
创建一个变量,以便在您的计算模型中向下引用。请看描述使用var self=this
以避免错误指向错误内容的惯例的答案。@jnevil好的指针,我一定会研究它们!在将var viewModel=function
转换为function viewModel(){…
之后,我得到了你的答案,这基本上是一样的,但是你的代码顺序很重要