2014-01-09 41 views
0

我正在使用knockout.js。我在表格中有幾個可編輯的網格,並且這些網格中的字段名稱很重要,所以使用uniqueName不是一種選擇。如何讓函數在jQuery的.each()函數完成後返回true?

所以我在做的是調用一個函數來重命名字段,當用戶點擊提交。

function renameFields(o, index) { 
    var el_name = $(o).attr('name'); 
    var name_index = el_name.lastIndexOf('_') + 1; 

    $(o).attr('name', el_name.substring(0, name_index) + index); 
} 

function Submit() { 
    self.submit = function() { 
    // Use unique AND meaningful input/textarea [name]s in .grids. 
    window.index_arr = []; 

    $('.grid').each(function() { 
     $(this) 
     .children('.row') 
     .each(function(i){ 
     window.index_arr.push(i); 

     $(this) 
     .find('input, textarea') 
     .each(function() { 
      renameFields($(this), window.index_arr[i]); 
     }) 
     }) 
    }); 

    // Submit the form 
    return true; 
    } 
} 

renameFields工作正常,但它呼籲每個字段之前返回true

+0

當用戶點擊提交時,它被**調用。 – curtisblackwell

+0

@Nix @ColBeseder這不是一個錯字。我只是沒有包含顯示綁定的html,因爲我知道這不是問題所在。該函數正在被調用,它在完成字段重命名之前返回「true」。你讀過這篇文章嗎? – curtisblackwell

+0

我知道這不是你的問題,但你有沒有想過綁定'name'屬性,所以KO讓它們保持最新? – johnnycardy

回答

2

讓淘汰賽做讓你的屬性的索引最新的是這樣的髒活:

HTML:

<div id="grid" class="grid"> 
    <div class="row" data-bind="foreach:rows"> 
     <input data-bind="attr: { name: 'string_' + $index() }"> 
     <textarea data-bind="attr: { name: 'string_' + $index() }"> 
    </div> 
</div> 

視圖模型:

var vm = { 
    rows: ko.observableArray() 
}; 

ko.applyBindings(vm, document.getElementById("grid")); 
+0

將'$ index'附加到字符串作爲'name'時,'$ index'返回一個函數而不是索引本身。見http://jsfiddle.net/curtisblackwell/Gafqz/。如果你刪除''test_'+',它可以正常工作。 – curtisblackwell

+0

啊,杜。只需要添加'()'來索引。 – curtisblackwell

+0

啊,對不起。發現得好。 – johnnycardy

0

請給我們更多關於你如何設置點擊處理程序...

我會帶SWAG在它...我認爲你正在處理hoisting

沒有小提琴我不能測試它,但嘗試下面的代碼。

var renameFields = function(o, index) { 
    var el_name = $(o).attr('name'); 
    var name_index = el_name.lastIndexOf('_') + 1; 

    $(o).attr('name', el_name.substring(0, name_index) + index); 
} 

var Submit = function() { 
    self.submit = function() { 
    // Use unique AND meaningful input/textarea [name]s in .grids. 
    window.index_arr = []; 

    $('.grid').each(function() { 
     $(this) 
     .children('.row') 
     .each(function(i){ 
     window.index_arr.push(i); 

     $(this) 
     .find('input, textarea') 
     .each(function() { 
      renameFields($(this), window.index_arr[i]); 
     }) 
     }) 
    }); 

    // Submit the form 
    return true; 
    } 
} 
相關問題