我使用Knockout.js 2.0和我试图通过添加计算观察到的,但其呕吐,延长我创建的构造函数的原型“self.IsSubDomain不是一个函数”。 我该如何解决这个问题? 有另一种方式来扩展一个构造函数来解决这个问题?
http://jsfiddle.net/StrandedPirate/J44S4/3/
注:我知道我可以定义构造函数的闭包的计算观察到的,但我建立了淘汰赛视图模型的自动代码生成器,我需要能够通过原型属性来延长我的对象。
我使用Knockout.js 2.0和我试图通过添加计算观察到的,但其呕吐,延长我创建的构造函数的原型“self.IsSubDomain不是一个函数”。 我该如何解决这个问题? 有另一种方式来扩展一个构造函数来解决这个问题?
http://jsfiddle.net/StrandedPirate/J44S4/3/
注:我知道我可以定义构造函数的闭包的计算观察到的,但我建立了淘汰赛视图模型的自动代码生成器,我需要能够通过原型属性来延长我的对象。
我也是在论坛上回答了这个 。
下面就来做到这一点(单程的jsfiddle例子 ):
<div data-bind="text: fullDomainName">test</div>
<script>
function SiteModel(rootUrl, data) {
var self = this;
self.rootUrl = rootUrl;
self.DomainName = ko.observable(data.DomainName);
self.IsSubDomain = ko.observable(data.IsSubDomain);
self.fullDomainName = ko.computed(self.fullDomainName, self);
}
SiteModel.prototype.fullDomainName = function () {
if (this.IsSubDomain() && this.DomainName()) { // bombs out here with "self.IsSubDomain is not a function"
return this.DomainName() + ".myCompanyWebsite.com";
}
else {
return this.DomainName();
}
};
var temp = new SiteModel("someurl", { DomainName: "extraCool" });
ko.applyBindings(temp);
</script>
我定义在原型的功能,使它成为计算在构造函数中观察到。
这里有一个办法做到这一点更通用的方法( 的jsfiddle例子 ):
<div data-bind="text: fullDomainName">test</div>
<script>
Function.prototype.computed = function() {
this.isComputed = true;
return this;
};
Object.prototype.makeComputeds = function() {
for (var prop in this) {
if (this[prop] && this[prop].isComputed) {
this[prop] = ko.computed(this[prop], this, {deferEvaluation:true});
}
}
};
function SiteModel(rootUrl, data) {
var self = this;
self.rootUrl = rootUrl;
self.DomainName = ko.observable(data.DomainName);
self.IsSubDomain = ko.observable(data.IsSubDomain);
self.makeComputeds();
}
SiteModel.prototype.fullDomainName = function () {
if (this.IsSubDomain() && this.DomainName()) { // bombs out here with "self.IsSubDomain is not a function"
return this.DomainName() + ".myCompanyWebsite.com";
}
else {
return this.DomainName();
}
}.computed();
var temp = new SiteModel("someurl", { DomainName: "extraCool" });
ko.applyBindings(temp);
</script>
所计算的基本读取功能将通过原型共享尽管实际计算的属性不会。 我想有可能是,如果你创建了一些对象,然后在原型改变功能的混乱。 新对象将使用新的功能,但旧对象不会。
由于计算的观测量的属性,你不应该期望能够通过原型将它们添加到现有的对象。