2013-05-04 56 views
4

我有一個表,並且我已經動態地添加/刪除了它的行。 該表包含將作爲MVC回收的字段。 在這種情況下更新與jQuery表意味着我了包含例如不完全的集合的集合......JQuery MVC集合名稱屬性

function add() { 
    $.ajax({ 
      url: "GetRow", 
      type: 'post', 
      dataType: 'html', 
      timeout: 30000, 
      data: { 
       RowIndex: otherRows.length, 
       "Item.Property1": $("option:selected", dropDown).text(), 
       "Item.Property2": $("option:selected", dropDown).val() 
      }, 
      success: function (result) { 
       var newRow = $(result); 
       tableBody.append(newRow); 
      } 
     }); 
} 

此功能使Ajax調用去獲得一個MVC操作結果返回一行結果在給定的索引,並額外設置一些默認值從我的網頁下拉。

現在讓我們假設我有一個類似的函數稱爲「刪除」,其中使用jquery我刪除一行,在這一點上表有3行(當然忽略頭行),我要刪除的行是中間一排。

這意味着在我行的字段最終看起來像這樣...

//Row 1: 
<input type="text" name="SomeCollection[0].Property1" /> 

//Row 2: 
    Nothing, deleted of course 

//Row 3: 
<input type="text" name="SomeCollection[2].Property1" /> 

所以,如果我現在做的回傳,因爲不一致的ID範圍時,MVC模型綁定只會結合項目1和我的項目2(實際上是客戶端刪除之前的項目3)未映射。

這個想法是,我希望我的服務器邏輯做一個非常簡單的「如果我的集合中的項目的ID不在發佈數據中,將它從數據庫中刪除」,這樣所有的集合操作都可以完全是客戶端,保存在這個非常重的頁面上的不斷回發。

於是我開始把一個函數一起jQuery來解決這個問題...

function updateNames(table) { 
    var rows = $("tr", table); 
    var index = 0; 

    rows.each(function() { 
     var inputFields = $("input"); 

     inputFields.each(function(){ 
      //replace name="bla[<any number>].Anything" with 
      //  name="bla[" + index + "].Anything"   
     }); 

     index++; 
    }); 
} 

所以我的問題是...我怎麼向jQuery的說,在與name屬性「替換[] [指數]」?

我知道這不會解決嵌套集合/其他這樣的複雜場景的問題,但一旦我有這個功能解決了我可以隨時擴展它,我的要求並沒有涉及到。

編輯:

對我目前的思維模式,一些額外的細節...好還是壞?

如果我抓住名稱屬性值和「散步字符」,直到我找到第一個「[」和下一個「]」,然後替換之間的一切,它應該解決我的問題,但這種類型的東西在IE可能像地獄一樣慢。

任何人都有一個整潔的「只是稱這個聰明的功能」類型的答案? (如果有的話)。

編輯2:

哇,我真的要更努力...我覺得什麼是蠢蛋一樣,現在有2個原因(不看和正則表達式是這裏一個顯而易見的解決方案)

JQuery: how to replace all between certain characters?

如果我能找出正確的正則表達式,我已經得到了我的解決方案(也許這是我應該問的問題,因爲我經常被正則表達式的瘋狂所困擾)。

但正則表達式的電源不能低估:)

回答

4

這應該爲你工作:

function updateNames(table) { 

    var rows = $("tr", table); 
    var index = 0; 

    rows.each(function() { 
     var inputFields = $(this).find("input"); 
     inputFields.each(function(){ 
      var currentName = $(this).attr("name"); 
      $(this).attr("name", currentName.replace(/\[(.*?)\]/, '['+index+']')); 

     }); 
     index++; 
    }); 
} 

如果有每一行內的多個輸入和你只是想更新一個再考慮使用'開始'jQuery選擇器:http://api.jquery.com/attribute-starts-with-selector/

+0

這是關於我到了哪裏,我似乎無法得到它的工作,雖然由於某種原因。 – War 2013-05-04 14:20:49

+0

究竟是什麼「不工作」呢?這也是我接觸到的解決方案。 – 2013-05-04 14:25:15

+0

大聲笑好,我們都犯了第一個錯誤......是第二個選擇器正在尋找文件廣泛。設置var inputFields – War 2013-05-04 14:30:04

4

雖然你已經有了一個解決方案,但我認爲一個可以從頭開始實現這個功能的工作演示可能是有用的。

假如你有每行一類的delete一個按鈕,你可以用下面的實現:

$('.delete').click(function(e) { 
    // Get table body and rows 
    var body = $(this).closest('tbody'); 

    // Remove current row 
    $(this).closest('tr').remove(); 

    // Get new set of rows from table body 
    var rows = body.find('tr') 

    // Update all indeces in rows 
    var re = new RegExp(/\[[0-9]+\]/); 
    var index = 0; 
    rows.each(function() { 
     $(this).find('input').each(function (e) { 
      var input = $(this).attr('name'); 
      if (input) { 
       $(this).attr('name', input.replace(re, '['+index+']')); 
      } 
     }); 
     index ++; 
    }); 
}); 

這應該刪除該行並更新每個輸入所有的indeces在剩餘行,以便它們會再次正確增加(因此將被模型綁定器正確綁定)。另外,它應該限制在當前表格中。 Here it is in action.

+0

我愛這個解決方案螞蟻,它精美地覆蓋了細節:) – War 2013-05-04 15:00:59