2012-11-12 41 views
1

上下文:我很喜欢我认为的“严肃的javascript/jquery编码”,我以前的尝试可能会被认为是叛逆:P。扩展javascript通用视图模型。 (Knockout)

我的问题:我注意到我们的一些客户端视图模型中的模式,并希望将它们中的一些整合到一个.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脚本模式,或者达到那种程度?

回答

1

我去年春天在一个大型项目上工作过,我们尝试了一种类似于你正在使用的模式。

有需要被considered-

  • 里面你ajax.success功能的问题,我们经常需要修改返回视图模式的能力。例如,添加ko.computed的。我建议你在ko.applybindings之前添加一个可覆写的函数。
  • 您需要有能力处理您的应用程序在返回数据时出现问题的情况。例如,数据库关闭或Web服务处于脱机状态。你需要有一个优雅的方式来处理这些情况。我们通过扩展视图模型来做到这一点,以便这些条件在不同的属性上返回。
  • 如果要返回要在表数据中显示的行数据,则可能必须修改ajax.success函数以处理数据数组。我们似乎总是遇到这方面的问题。

我喜欢你的视图模型。它是一个灵活且可扩展的代码片断。我将在下一个项目中借用它。

+0

我误解你的第一个观点@第一,否则我会接受更快......谢谢你,我想我会尝试可覆盖的功能/钩选项。关于你的第二点,如果你们还没有解决这个问题,我使用amplify来挂钩我们创建的全局事件,该事件管理我们在应用程序中获得的通知栏。 –

+0

介绍如何创建可覆写的功能。 到目前为止,我的最佳尝试是这样的。 self.observables = ko.mapping.fromJS(result); ko.mapping.fromJS(options.customObservables,self.observables); ....但它不工作,因为我没有访问自我。观察对象当我创建自定义计算/观察值时 –

+0

定义像hasChanges函数一样的函数。从ajax.success中调用它。然后,当您实例化类时,为虚拟版本分配一个新函数。如果您仍然遇到问题,我可以在今晚更新我的答案以示例 –