2012-11-12 77 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中調用它。然後,當您實例化類時,爲虛擬版本分配一個新函數。如果您仍然遇到問題,我可以在今晚更新我的答案以示例 –