knockout订阅功能附加到属性列表

时间:2013-12-04 13:56:40

标签: knockout.js

我已通过以下方式在淘汰赛中定义了订阅功能:

// subscriber for autosave function that is within handler
ko.subscribable.fn.withAutoSave = function (prop, handler) {
    var self = this;

    //subscribe to changes
    this.subscribe(handler.bind(this, self, prop));

    return this;
};

这就是我将其附加到属性的方式:

self.CompanyName = ko.observable(data.CompanyName).withAutoSave("CompanyName", saveFieldValueFunction.bind(this, this.Id));    

有没有一种方法和正确的语法用于我可以做这样的事情:

1)定义propertyname数组:var propertynames = ['CompanyName', 'Property1', 'Property2' ...];

2)通过所有属性名循环并订阅: withAutoSave(propertyName, saveFieldValueFunction.bind(this, this.Id));

我将描述为什么我需要这个: 我有一个定义的模型,从2种不同的形式调用。我可以重用它,但对于一种形式我需要“withUpdateSave”,但对于另一种形式我不需要它。所以我想要一个选项来定义我是否需要这个。

1 个答案:

答案 0 :(得分:1)

最小阻力的路径可能是向withAutoSave添加一个布尔参数来确定它是否应该实际执行任何操作,然后将其绑定到viewmodel中的一个observable属性,您可以在代码中设置或清除该属性。显示表格,例如

ko.subscribable.fn.withAutoSave = function (prop, handler, enabled) {
  var self = this;
  this.subscribe(function () {

//        if (enabled()) {
// UPDATED: use ko.unwrap() so enabled can be
// either an observable or an ordinary value

    if (ko.unwrap(enabled)) {
      handler.call(self, self, prop);
    }
  });
  return this;
};

然后:

self.CompanyName = ko.observable(data.CompanyName).withAutoSave("CompanyName", saveFieldValueFunction.bind(this, this.Id), self.doAutoSave);

然后self.doAutoSave(true)将启用自动保存,self.doAutoSave(false)将禁用它