【问题标题】:knockout pass additional parameters to subscription function敲除将附加参数传递给订阅函数
【发布时间】:2013-12-11 13:04:59
【问题描述】:

我想要实现的是为模型属性创建订阅。此订阅函数应通过 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 函数(或者我也可以换句话说 - 我需要能够在update 中获取viewModel.ModelId 属性值,以及propertyName)。

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

作为 CompanyName 属性的示例,它将是:

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

在哪里

3 == viewModel.ModelId

【问题讨论】:

  • 我更新了我的答案,我很好奇你走了什么路线。

标签: javascript jquery ajax knockout.js


【解决方案1】:

可能有更好的方法来做到这一点,但以下方法会起作用:

首先,在 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 函数的范围设为对象的范围。

【讨论】:

  • 它在更新函数的第一个参数中给了我 propertyValue 而不是 propertyName。
  • 我已经更新了两者以包括旧值、属性名称、新值和模型 id,尽管我想知道是否有更雄辩的方法来做到这一点,而不必为属性名称。
【解决方案2】:

您可以将函数声明为“fn”范围之外的变量。

var dataservice = 'my class that has the data calls';

var altFunc = function () {
        
    return ko.pureComputed(function () {
        var currentItem = this().filter(function (item) {
        
// Do knockout stuff here and return your data
// also make calls to the dataservice class
        
        }, this, dataservice);

        
    };


ko.observableArray.fn.someNewFunctionality = altFunc;

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 2016-04-26
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2020-08-12
    • 2018-06-17
    • 2015-07-19
    • 2011-12-21
    相关资源
    最近更新 更多