KnockoutJS 3:最小化viewModel之间的重复代码

时间:2014-12-17 16:12:42

标签: javascript mvvm knockout.js

我收到让其他人看到我的代码的请求,并且已经做了很多清理,评论和使事情更具可读性和效率,但我的KnockoutJS viewModels遇到了很大的困难。

基本上我有1个主viewModel和多个subModels,它们都从不同的URL中提取JSON数据,然后用ko.mapping插件映射它们。除此之外,我还使用Ryan Niemeyer的示例在每个isDrity上实现了subModel,以及一些额外的函数来保存,重置和清除对象属性上的isDirty标志。因此,这会导致每个subModel中的代码重复,我希望将其清理干净。

var viewModel = {

  subModel1 = ko.observable(),
  subModel2 = ko.observable(),
  subModel3 = ko.observable(),
  subModel4 = ko.observable(),
  subModel5 = ko.observable(),
  subModel6 = ko.observable(),

}
ko.applyBindings(viewModel)

// subModel1 Stuff
$.getJSON('/admin/getusers.json', function(data) {
  var mapping1 = { /* Mapping code here */ }
  var mappedModel1 = ko.mapping.fromJS(data, mapping1);


  // REPEATING BLOCK
  allDirtyItems1 = ko.computed(function() {
    /* Some Code Here */
  });

  countDirtyItems1 = ko.computed(function() {
    /* Some Code Here */
  });

  resetEdits1 = function() {
    /* Some Code Here */
  }

  saveEdits1 = function() {
    /* Some Code Here */
  }
  // END OF REPEATING BLOCK

  uniqueFunction1 = functon() {
    /* Some Code Here */
  }

  uniqueFunction2 = functon() {
    /* Some Code Here */
  }  

  viewModel.subModel1(mappedModel1)

}

// subModel2 Stuff
$.getJSON('/admin/getdeployments.json', function(data) {
  var mapping2 = { /* Mapping code here */ }
  var mappedModel2 = ko.mapping.fromJS(data, mapping2);


  // REPEATING BLOCK
  allDirtyItems2 = ko.computed(function() {
    /* Some Code Here */
  });

  countDirtyItems2 = ko.computed(function() {
    /* Some Code Here */
  });

  resetEdits2 = function() {
    /* Some Code Here */
  }

  saveEdits2 = function() {
    /* Some Code Here */
  }
  // END OF REPEATING BLOCK

  someOtherUniqueFunction1 = functon() {
    /* Some Code Here */
  }

  someOtherUniqueFunction2 = functon() {
    /* Some Code Here */
  }  

  viewModel.subModel2(mappedModel2)

}

我已尝试使用ko.utils.extend,但这似乎不适用于subModels插件创建的ko.mapping,因为生成的subModel只是我的JSON数组来自服务器的数据。

var sharedFunctions = function() {

    sharedFunction1 = function() {
        console.log('Hello, world!');
    }

}

ko.utils.extend(mappedModel1, sharedFunctions);
viewModel.subModel1(mappedModel1)

我还尝试在其中使用某种baseViewModel移动重复代码,然后将其属性继承到subModels,但这似乎不适用于ko.computed(),因为它们只有在我初始化subModel并且之后不更新时才启动一次。

此外,我的代码的结构方式,我被迫allDirtyItems1allDirtyItems2allDirtyItems3等。而不是只有相同的allDirtyItems属性每个subModel

TL; DR:我想摆脱重复的代码块。

谢谢。

0 个答案:

没有答案