2011-10-10 116 views
2

我使用JQuery Validate驗證我的webapp上的表單。我可以通過JQuery驗證的規則列表中使用來驗證我的形式是這樣的:從服務器獲取JSON函數

$("#myform").validate({ 
    rules: { 
    age: { 
     required: true, 
     min: 3 
    }, 
    parent: { 
     required: function(element) { 
     return $("#age").val() < 13; 
     } 
    } 
    } 
}); 

現在我想在服務器上生成的驗證規則,而不是在我的JavaScript編碼他們,做一個$就請求獲取它們,將它們附加到表單並完成設置。

但這

{ 
     rules: { 
     age: { 
      required: true, 
      min: 3 
     }, 
     parent: { 
      required: function(element) { 
      return $("#age").val() < 13; 
      } 
     } 
     } 
    } 

不是有效的JSON,因爲函數聲明。有沒有辦法做到這一點?

詳細說明:我的應用程序由靜態HTML和JS構成,我與服務器的唯一交互是使用一些返回JSON的REST服務。 所以,當我從服務器得到一個人,因爲我想在表單編輯它,我做

$.ajax({url: '/person/1', 
    success: function(data) { 
     /* fill form fields */ 
     ... 
     /* get validation rules from server and attach to form 
     something like */ 
     $.ajax({url: '/person/validation_rules', 
     success: function(rules) { 
      /* something like */ 
      $('#myform').validate(rules); 
     } 
    } 
}); 

感謝。

+1

JavaScript函數不是JSON有效的數據類型,將其轉換成字符串,然後使用' eval'(因爲你信任源)並以此方式執行。 – Anders

+0

@Anders - 這太過分了......您將從服務器上的JS文字轉到JSON字符串,使用字符串編碼函數,然後通過線路發送它,反序列化JSON字符串,然後解碼功能?爲什麼不把它作爲一個文字發送呢? – jvenema

回答

0

如何簡單地將它作爲JS文字返回,而不是作爲JSON?

編輯:

你的原始描述包括:

{ 
     rules: { 
     age: { 
      required: true, 
      min: 3 
     }, 
     parent: { 
      required: function(element) { 
      return $("#age").val() < 13; 
      } 
     } 
     } 
    } 

這是一個JS文字,而不是一個JSON ,並且是完全有效的從服務器返回,在其本身。不需要額外的更改,並且函數聲明就好。 JSON只是JS文字的一個子集。 (http://www.json.org/js.html)。

因此,您可以通過一些AJAX請求輕鬆地從您的服務器返回該結構,就像它一樣。

有關詳細信息:http://snook.ca/archives/javascript/json_is_a_subse

+0

你是什麼意思與JS文字? A JS ?你能詳細說明一下嗎? – Simon

0

如果您已經在服務器上生成JavaScript,你並不需要把它作爲加載JSON。如果你從http://myserver.com/validation.js加載這個函數,而不是用ajax調用它,只需從腳本標籤調用它,例如。

<script src="http://myserver.com/validation.js"></script> 

您還需要編輯小幅生成的代碼:

var validationRule = { 
     rules: { 
     age: { 
      required: true, 
      min: 3 
     }, 
     parent: { 
      required: function(element) { 
      return $("#age").val() < 13; 
      } 
     } 
     } 
    } 

那麼您的驗證看起來像

$("#myform").validate(validationRule); 

編輯:如果服務器響應必須是JSON,可以把它作爲一個字符串和eval()它。或者你可以安排一些有效的JSON,你可以調整到需要的形式,說:

{ 
    ... 
    "minParentAge": 13 
} 

,然後從中構造函數。

+0

感謝Slartibartfast。不會爲每個規則生成全局變量嗎?我有點擔心命名空間污染。 – Simon

+0

有多少規則?我想,你可以制定一個「規則」對象,並將特定規則作爲其字段。 – Slartibartfast

+0

每個實體/每個表單都有一個用於我的應用。很多。但是,如果這是我能夠與之共存的唯一方式,並創建一個具有驗證規則的全局數組。這不是很好,但會起作用。 – Simon

0

創建一個全局變量作爲根名稱空間 - 就像第三方庫,如jQuery做的一樣。稱之爲MyNamespace

然後加載填充此名稱空間的js文件,這樣您就可以獲得最小的DOM佔用空間。

我的首選方法是做這樣的:

<myFunctions.js> 

MyNamespace = window.MyNamespace || {}; 

(function(){ 

    function utilityFunction1() { 
    //.... 
    } 

    function utilityFunction2() { 
    //.... 
    } 

    MyNamespace.UtilityFunctions = { 
    utilityFunction1: utilityFunction1, 
    utilityFunction2: utilityFunction2 
    }; 

})(); 


</myFunctions.js> 

然後包括它像往常一樣

<script src="myFunctions.js" type="text/javascript"></script>