Tug*_*ain 7 javascript knockout.js
我正在使用Knockout.js 2.0,我试图通过添加一个计算的observable来扩展我创建的构造函数的原型,但它抛出"self.IsSubDomain不是函数".我该如何解决这个错误?有没有其他方法来扩展构造函数来解决这个问题?
http://jsfiddle.net/StrandedPirate/J44S4/3/
注意:我知道我可以在构造函数的闭包中定义计算的observable,但是我正在为挖空视图模型构建一个自动代码生成器,我需要能够通过prototype属性扩展我的对象.
我也在论坛上回答了这个问题.
这是一种方法(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>
Run Code Online (Sandbox Code Playgroud)
我已经在原型中定义了函数,并使它在构造函数中成为一个计算的observable.
这是一种更通用的方式(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>
Run Code Online (Sandbox Code Playgroud)
计算的基础读取函数将通过原型共享,尽管实际的计算属性不会.我想如果你创建了一些对象然后改变了原型中的函数,可能会有混淆.新对象将使用新函数,但旧对象不会.
由于计算的observable是属性,因此您不应期望能够通过原型将它们添加到现有对象.
| 归档时间: |
|
| 查看次数: |
3590 次 |
| 最近记录: |