gpt4 book ai didi

javascript - knockout 将附加参数传递给订阅函数

转载 作者:数据小太阳 更新时间:2023-10-29 04:51:19 25 4
gpt4 key购买 nike

我想要实现的是为模型属性创建订阅。这个订阅函数应该通过 Ajax 调用 WebApi 更新数据库中的属性值。对于 ajax 调用,我需要三个参数:“fieldName”、“fieldValue”和“modelId”,ajax 将根据这三个参数更新数据库行参数。

我有很多属性,它们都需要相同的功能,所以我不想单独订阅每个属性,所以我找到了以下建议:

ko.subscribable.fn.withUpdater = function (handler) {
var self = this;
this.subscribe(handler);
//support chaining
return this;
};

添加它是如何“附加”到可观察对象的:

self.ModelId= ko.observable();
self.CompanyName = ko.observable().withUpdater(update);

其中 update 是模型外的一些 js 函数。

但是,我遇到了问题,因为我无法将三个参数传递给 update 函数(或者我可以换句话说 - 我需要能够获取 viewModel。 update 中的 ModelId 属性值,以及 propertyName)。

function update (propertyName, propertyNewValue, anotherPropertyValue) {
//do ajax update
}

以 CompanyName 属性为例,它将是:

update("CompanyName", "New Company value here", 3), 

在哪里

3 == viewModel.ModelId

最佳答案

可能有更好的方法来执行此操作,但以下方法会起作用:

首先,在 withUpdate 方法中添加一个目标对象:

ko.subscribable.fn.withUpdater = function (handler, target, propname) {
var self = this;

var _oldValue;
this.subscribe(function (oldValue) {
_oldValue = oldValue;
}, null, 'beforeChange');

this.subscribe(function (newValue) {
handler.call(target, _oldValue, newValue, propname);
});

return this;
};

更新订阅函数将限定在目标属性范围内:

var update = function (propertyName) {
console.log('propname is '+ propname + ' old val: ' + oldvalue + ', new val: ' + newvalue + ', model id: ' + this.ModelId());
}

现在您需要以不同的方式使用它。

  self.CompanyName = ko.observable().withUpdater(update, self, "CompanyName");

一个例子 http://plnkr.co/edit/HhbKEm?p=preview

如果不显式传入目标和公司名称字符串,我无法将 withUpdater 函数的作用域设为对象的作用域。

关于javascript - knockout 将附加参数传递给订阅函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20216214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com