我收到让其他人看到我的代码的请求,并且已经做了很多清理,评论和使事情更具可读性和效率,但我的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
并且之后不更新时才启动一次。
此外,我的代码的结构方式,我被迫allDirtyItems1
,allDirtyItems2
,allDirtyItems3
等。而不是只有相同的allDirtyItems
属性每个subModel
TL; DR:我想摆脱重复的代码块。
谢谢。