将通过原型计算的可观察对象添加到构造函数中
Adding a computed observable via the prototype to a constructor function
我正在使用 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>
计算的底层读取函数将通过原型共享尽管实际计算的属性不会。我想可能有如果您创建了一些对象,然后在原型。新对象将使用新函数,但旧对象不会。
由于计算的可观察量是属性,因此不应期望能够通过原型将它们添加到现有对象中。
相关文章:
- FabricJs-限制主对象内添加对象的移动区域
- 向Angular作用域对象添加对象数组——TypeError
- Javascript使用+添加对象
- 动态添加对象的jQuery事件处理程序
- 添加JQuery UI在Meteor中添加对象后可调整大小
- 在我的上下文中添加对象的动态方法
- 如何检测是否已使用 angular.forEach AngularJS 添加对象
- 在对象coffeescript中添加对象数组
- 使用Jquery在单击“”时显示表单;添加对象”;按钮
- 我可以向数组添加对象键吗
- 向扩展数组的JS集合添加对象(继承?)
- 尝试通过从自动完成推送添加对象时缺少 $$Hashkey
- 添加对象值 Javascript
- 在上传问题时添加对象
- 如何使用 javascript 的变量名称在数组中添加对象属性
- 在 JavaScript/TypeScript 中动态地“直接”添加对象属性到“this”
- 如何仅当对象不存在时才使用javascript添加对象
- 如何在数组末尾添加对象的副本
- rails在javascript url中添加对象
- ThreeJS-按不同顺序添加对象会影响alpha/显示