扩展javascript通用视图模型。(淘汰赛)
上下文:我对我喜欢的“严肃的javascript/jquery编码”相当陌生,我以前的尝试可能会被认为是叛国:p 我的问题:我注意到我们的一些客户端视图模型中存在一种模式,我想将其中一些整合到一个.js文件中。 除了需要创建一组附加的可观察对象的屏幕之外,在大多数情况下,一切似乎都正常工作,这不一定映射到从服务器返回的JS对象扩展javascript通用视图模型。(淘汰赛),javascript,jquery,knockout.js,knockout-mapping-plugin,Javascript,Jquery,Knockout.js,Knockout Mapping Plugin,上下文:我对我喜欢的“严肃的javascript/jquery编码”相当陌生,我以前的尝试可能会被认为是叛国:p 我的问题:我注意到我们的一些客户端视图模型中存在一种模式,我想将其中一些整合到一个.js文件中。 除了需要创建一组附加的可观察对象的屏幕之外,在大多数情况下,一切似乎都正常工作,这不一定映射到从服务器返回的JS对象 var AdminPages = AdminPages || {}; AdminPages.SimplePageVM: function (options) {
var AdminPages = AdminPages || {};
AdminPages.SimplePageVM: function (options) {
var self = this;
self.hasChanges = function () {};
self.isValid = function () {};
// CRUD Actions
self.get = function () {
$.ajax({
url: options.getUrl,
dataType: 'json',
data: !$.isEmptyObject(options.someId) ? { someId: options.someId} : null,
success: function (result) {
self.observables = ko.mapping.fromJS(result);
ko.editable(self.observables);
ko.applyBindings(self, $('form')[0]);
},
error: function (result) {}
});
};
self.save = function () {};
self.edit = function () {};
self.cancel = function () {};
// Initialise the viewmodel on create
self.get();
}
我想将以下内容添加到视图模型中。我想我需要创建一个全新的对象(因为self.observables只有在get函数成功时才能创建),然后在item绑定上添加我的新对象及其属性
我想补充的是:
self.newObject.IsPercentageEvaluation =
ko.computed(function () {
var isPercentage = self.observables.IsPercentageBased() == 'true';
if (isPercentage) {
self.observables.BalancePercentage('40');
} else {
self.observables.BalancePercentage('');
}
return isPercentage;
});
总而言之:
$(function () {
var obj = {
IsPercentageEvaluation = ko.computed(...);
};
AdminPages.SimplePageVM({
getUrl: '@Url.Action("Get", "SomeController")',
editUrl: '@Url.Action("Update", "SomeController")',
organisationId: '@ViewBag.OrganisationID',
newObject: obj
});
} ($));
我只是想确认一下,这是否是处理这种情况的正确方法?或者是否有更好的方法,例如使用某个java脚本模式,或者某种程度上的方法?去年春天我在一个大型项目上工作,我们尝试遵循与您使用的模式类似的模式 有一些问题需要考虑-
- 在ajax.success函数中,我们通常需要修改返回的视图模式。例如,添加ko.computed。我建议您为此添加一个在ko.applybindings之前调用的可重写函数
- 您需要能够处理应用程序返回数据时出现问题的情况。例如,数据库关闭或web服务脱机。你需要有一个优雅的方式来处理这些情况。为此,我们扩展了视图模型,以便在单独的属性上返回这些条件李>
- 如果返回要在表数据中显示的行数据,则可能必须修改ajax.success函数以处理数据数组。我们似乎总是在这方面遇到问题李>
我很喜欢你的视图模型。它是一段灵活且可扩展的代码。我将在下一个项目中借用它。去年春天我在一个大型项目中工作,我们尝试遵循与您使用的模式相似的模式 有一些问题需要考虑-
- 在ajax.success函数中,我们通常需要修改返回的视图模式。例如,添加ko.computed。我建议您为此添加一个在ko.applybindings之前调用的可重写函数
- 您需要能够处理应用程序返回数据时出现问题的情况。例如,数据库关闭或web服务脱机。你需要有一个优雅的方式来处理这些情况。为此,我们扩展了视图模型,以便在单独的属性上返回这些条件李>
- 如果返回要在表数据中显示的行数据,则可能必须修改ajax.success函数以处理数据数组。我们似乎总是在这方面遇到问题李>
我很喜欢你的视图模型。它是一段灵活且可扩展的代码。我将在下一个项目中借用它。我误解了你的第一点@first,否则我会很快接受。。。谢谢,我想我会尝试一下可重写函数/挂钩选项。关于你的第二点,如果你们还没有解决它,我将使用amplify连接到我们创建的一个全局事件,该事件管理我们应用程序中的通知栏。请注意解释一下我将如何创建可覆盖功能。到目前为止,我最好的尝试就是这样。self.observates=ko.mapping.fromJS(结果);ko.mapping.fromJS(options.customObservables,self.observables)。。。。但它不起作用,因为当我创建自定义的computed/Observerables定义一个类似hasChanges函数的函数时,我无法访问self.observables对象。从ajax.success中调用它。然后,当您实例该类时,为虚拟版本分配一个新函数。如果您仍然有问题,我可以今晚更新我的答案,以显示一个示例如果您能够提供一个代码示例,我将不胜感激。即使只是为了澄清,如果有人必须找到这个。可能是我的java n00bness,但我甚至不知道如何重写伪函数?这就是我想说的,(据我所知……我可能完全错了)AdminPages.SimplePageVM.prototype.DummyFunction=function(){…}我误解了你的第一点@first,否则我会很快接受。。。谢谢,我想我会尝试一下可重写函数/挂钩选项。关于你的第二点,如果你们还没有解决它,我将使用amplify连接到我们创建的一个全局事件,该事件管理我们应用程序中的通知栏。请注意解释一下我将如何创建可覆盖功能。到目前为止,我最好的尝试就是这样。self.observates=ko.mapping.fromJS(结果);ko.mapping.fromJS(options.customObservables,self.observables)。。。。但它不起作用,因为当我创建自定义的computed/Observerables定义一个类似hasChanges函数的函数时,我无法访问self.observables对象。从ajax.success中调用它。然后,当您实例该类时,为虚拟版本分配一个新函数。如果您仍然有问题,我可以今晚更新我的答案,以显示一个示例如果您能够提供一个代码示例,我将不胜感激。即使只是为了澄清,如果有人必须找到这个。可能是我的java n00bness,但我甚至不知道如何重写伪函数?就我所知,我可能完全错了,在这里我会这样做吗?AdminPages.SimplePageVM.prototype.DummyFunction=function(){…}