将computedObservable添加到现有javascript视图模型
我有下面的视图模型将computedObservable添加到现有javascript视图模型,javascript,knockout.js,Javascript,Knockout.js,我有下面的视图模型 function PageSectionVM(pageSection) { var self = this; self.SectionName = ko.observable(); self.Markup = ko.observable(); self.update(pageSection); } 我还创建了上述构造函数中调用的update方法 PageSectionVM.prototype.update = function (pageS
function PageSectionVM(pageSection) {
var self = this;
self.SectionName = ko.observable();
self.Markup = ko.observable();
self.update(pageSection);
}
我还创建了上述构造函数中调用的update方法
PageSectionVM.prototype.update = function (pageSection) {
var self = this;
pageSection = pageSection || {};
self.SectionName(pageSection.SectionName);
self.Markup(pageSection.Markup);
};
这是捆绑在自己的文件,我想在几个页面重用这个虚拟机。在一个特定的页面上,我想“扩展”这个viewmodel以包含一个新函数。我已经尝试过在PageSectionVM的原型中添加一个新函数,就像这样
PageSectionVM.prototype.tabName = function () {
var self = this;
return "#tab-" + self.SectionName();
};
如果我将其添加为敲除绑定语句,它将返回函数的文本,而不是函数结果。我觉得我错过了什么。如果我将tabName
添加为原始viewmodel中的computedObservable,它会起作用,但这意味着我在我的“常规”viewmodel的代码中为一个目的添加了特定的代码(这是我想要避免的)
我使用的淘汰绑定语句是
<a data-bind="attr:{href: tabName}, text:SectionName"></a>
它位于PageSectionVMs的observableArray上的foreach绑定内部。text属性很好,但href最终包含函数的文本,而不是其结果
非常感谢您的帮助。我不明白您为什么在使用计算机时遇到问题。如果您想使用prototype,可以按如下方式进行: 我还添加了url编码并初始化了模型
function PageSectionVM(pageSection) {
var self = this;
self.SectionName = ko.observable(pageSection.SectionName);
self.Markup = ko.observable(pageSection.Markup);
self.TabName = ko.computed(this.getTabName, self);
};
PageSectionVM.prototype.getTabName = function () {
var self = this;
return "#tab-" + encodeURIComponent(self.SectionName());
};
如果我将其添加为敲除绑定语句,它将返回函数的文本,而不是函数结果
当然有。敲除绑定的工作方式如下:
- 检查界限值是否为可观察值
- 如果是,则打开它(即“执行它”)
- 将剩余的内容转换为字符串并在视图中使用
SectionName()
是一个普通的旧函数时,如果您的绑定看起来像text:SectionName
,您将获得函数文本
PageSectionVM.prototype.update = function (pageSection) {
var self = this;
pageSection = pageSection || {};
self.SectionName(pageSection.SectionName);
self.Markup(pageSection.Markup);
};
由于可观察对象的工作方式(w/r/t依赖项跟踪&此
处理),您不能在原型中使用它们,它们必须存在于实例中
这意味着:
- 要么将它们放在实例中(如@wayneelley建议)
- 或者您自己在视图中调用它们(
)text:SectionName()
- 或者使用
扩展预先存在的ko.utils.extend()
实例,并使用额外的可观察/计算对象PageSectionVM
ko.utils.extend()
只是一种方便的方法,就像jQuery的.extend()
一样。您还可以创建包含PageSectionVM
实例的包装器viewmodel。或者编写PageSectionVM
的构造函数时,它可以识别您给它的参数类型,并根据这些参数构建不同的对象。或者使用KO的映射插件使构造函数完全动态。非常感谢您的帮助。。我已经走上了包装的道路。