【发布时间】:2013-12-18 22:06:40
【问题描述】:
我的 JS 被组织成视图模型和服务。这些服务主要关注 AJAX 调用,而我的 viewModel 描述了它们所使用的视图。
我现在有两个视图模型 - StoreViewModel 和 MyStoreViewModel。在每一个中,我都有以下内容:
function MyStoreVm(model) {
var self = this;
self.doThis = function(){
// do stuff
self.doThat();
};
}
然后:
function StoreVm(model) {
var self = this;
self.doThis = function(){
// do stuff
self.doThat();
};
}
我来自 C# 背景 - 通常我只会在这种情况下使用继承。如何通过让它们从第三个共享模块继承来消除两个不同模块/视图模型之间的这种代码重复?
更多详细信息:这些在 MVC 视图中使用,根据商店是否为 MyStore,我有淘汰赛绑定:
@if (!Model.IsMyStore) {
<script type="text/javascript">
$(document).ready(ko.applyBindings(new StoreVm(@Html.Raw(JsonConvert.SerializeObject(Model, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() })))));
</script>
} else if (Model.IsMyStore) {
<script type="text/javascript">
$(document).ready(ko.applyBindings(new MyStoreVm(@Html.Raw(JsonConvert.SerializeObject(Model, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }).Sanitize()))));
</script>
}
更新
我查看了以下一些建议,但对于我的新手技能来说,似乎没有一个足够干净和简单。我尝试了以下似乎可行的方法:
function BaseStore(model){
self.doThis = function(){
// do stuff
self.doThat();
};
// and a whole lot of other shared code
}
function StoreVm(model) {
var storeVm = new BaseStoreVm(model)
var self = storeVm;
self.isolatedFunctionForGenericStores = function(){stuff}
// other stuff for only this type
return storeVm;
}
function MyStoreVm(model) {
var myStoreVm = new BaseStoreVm(model)
var self = myStoreVm;
self.isolatedFunctionForMyStore = function(){stuff}
// other stuff for only this type
return myStoreVm;
}
这种方法有什么问题吗?
【问题讨论】:
标签: javascript mvvm knockout.js