Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将computedObservable添加到现有javascript视图模型_Javascript_Knockout.js - Fatal编程技术网

将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
    实例,并使用额外的可观察/计算对象

我在使用计算机时没有问题。事实上,这是最有意义的,但我无法让它工作,除非我将计算结果添加到PageSectionVM。但正如我在问题中所说的,我试图不在PageSectionVM中添加一个只对一个用例有意义的计算结果,我想在一系列用例中使用它。所以简而言之,我试图扩展PageSectionVM,为一个用例计算一个额外的值。这更有意义吗?我只是沿着原型的路线走,试图用另一种方式解决这个问题。听起来你应该使用继承。奇怪的是,我沿着这条路线走,遇到了一些问题。我会回顾我的回购协议,并找到我试验的签入点。如果没有别的,这说明我对幕后的javascript知之甚少。。感谢您的反馈,非常清楚:)从您的回复中,听起来我应该走ko.utils.extend()的路线。我现在要研究这个问题。好吧,你可以用任何你喜欢的方式在现有对象上添加新属性
ko.utils.extend()
只是一种方便的方法,就像jQuery的
.extend()
一样。您还可以创建包含
PageSectionVM
实例的包装器viewmodel。或者编写
PageSectionVM
的构造函数时,它可以识别您给它的参数类型,并根据这些参数构建不同的对象。或者使用KO的映射插件使构造函数完全动态。非常感谢您的帮助。。我已经走上了包装的道路。