2012-07-05 168 views
4

我有一個插件,通常處理用於CRUD操作的jQuery對話框的創建。添加到對話框中的表單的標記在插件代碼的外部可用,插件只需要向http服務提供標記,並在收到時簡單地將其添加到對話框本身。動態添加驗證規則

然後,我在插件(onSetupValidation函數)中創建了一個回調函數,它是插件用戶爲每個表單定製驗證的句柄。這是我使用的代碼示例

var element = $('#mydiv'); 
element.crudplugin({ 
    [...] 
    onSetupValidation: function(markup) { 
     var form = $('#myForm', markup); 
     var container = $('<div class="error"><p>Errors were found validating your form. Please correct them and retry.</p><ol></ol></div>') 
         .appendTo(form).hide(); 
     var validator = form.validate({ 
      errorContainer: container, 
      errorLabelContainer: $('ol', container), 
      errorElement: 'em', 
      wrapper: 'li', 
      highlight: function (element) { 
       $(element).addClass("ui-state-error"); 
      }, 
      unhighlight: function (element) { 
       $(element).removeClass("ui-state-error"); 
      }, 
      submitHandler: function (form) { 
       [...] 
      } 
     }); 
    } 
    [...] 
}); 

好吧。讓我們來看看問題

  1. 如果我在標記內添加驗證規則(作爲類屬性),驗證根本不起作用。同樣的行爲,如果我在validate()方法
  2. 周圍的Googling添加規則我發現有很多的樣品,expecially這裏是這樣,使用validation plugin喜歡的.rules('add', rule)方法下面的示例中,所有這些鏈接建議致電validate下面的示例中添加任何規則,像以前一樣的方法

    $("#myField", markup).rules("add", { required: true }); 
    

但是,如果使用時istruction得到執行我收到以下錯誤此方法:

SCRIPT5007: Unable to get value of the property 'settings': object is null or undefined jquery.validate.min.js, line 15 character 257

有什麼建議嗎?

回答

4

你絕對是在正確的軌道上。

關鍵是您必須在窗體中向單個字段添加規則之前,在窗體上調用validate

如果您想查看觸發此案例的示例,則可以檢出my answer to a previous question(或特別是jsfiddle)。在那個jsfiddle中,如果你註釋掉最後4行的javascript($('#myForm').validate({/* ... */});),它會觸發你看到的同樣的錯誤信息。

從您的問題中也不清楚,但您可能在窗體可見之前調用validate?如果是這樣,那麼很可能是沒有幫助...

+0

感謝您的回答。在創建對話框和表單顯示之前調用回調。在回調中,我先調用validate()然後添加規則。我將嘗試在show()方法後移動回調... – Lorenzo 2012-07-05 22:42:36

+0

這樣做肯定會 - 如果這是一個jQuery對話框,「open」事件將是一個合適的地方。 – Ryley 2012-07-05 22:47:28

0

只需添加。如果你不介意使用醜陋的代碼,你可以做這樣的事情

var your_new_object = $("#theForm").validate().settings; 
your_new_object ... //do some stuff with it 
$("#theForm").validate().setting = your_new_object; 

凡your_new_object是原始設置的更新版本對象

正如我所說的,是一個醜陋的做法,但如果沒有別的作品,試試看