扩展javascript通用视图模型。(淘汰赛)

扩展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) {

上下文:我对我喜欢的“严肃的javascript/jquery编码”相当陌生,我以前的尝试可能会被认为是叛国:p

我的问题:我注意到我们的一些客户端视图模型中存在一种模式,我想将其中一些整合到一个.js文件中。

除了需要创建一组附加的可观察对象的屏幕之外,在大多数情况下,一切似乎都正常工作,这不一定映射到从服务器返回的JS对象

 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(){…}