2016-02-09 26 views
8

ContextDi mảng từ đối tượng javascript

Tôi đang cố gắng để thực hiện một chức năng để khi người dùng nhấp vào một hộp kiểm trong một bảng, thuộc tính valuedata-title của hộp kiểm sẽ được lưu trữ trong một JS đối tượng theo nghĩa đen có tên là selected làm phần tử mảng cặp khóa-giá trị mới.

Trong trường hợp người dùng nhấp lần thứ hai trên cùng một hộp kiểm, phần tử mảng tương ứng sẽ bị xóa.

Issue

Lần đầu tiên một hộp kiểm được nhấp, một mảng được tạo ra trong đối tượng selected như dự định.

Tuy nhiên, khi hộp kiểm tương tự được nhấp lần thứ hai, thay vì xóa mảng tương ứng, một số mới (lặp lại) được thêm.

var selected = {items:[]};  
$('#table').on('click', 'input[type="checkbox"]', function() { 
    var found = false; 
    $.each(selected.items, function(i, val) { 
     if (val.key == $(this).attr("value")) { 
      selected.items.splice(i ,1); 
      found = true; 
      return false; //step out of each() 
     } 
    }); 

    if (found == false) { 
     selected.items.push({key: $(this).attr("value"), value: $(this).attr("data-title")}); 
    } 

    console.log(selected); 
}); 
+0

Tại sao không làm cho nó phụ thuộc vào trạng thái 'kiểm tra' của hộp kiểm? Tôi giả sử mảng của bạn nên đại diện cho các hộp hiện đang được kiểm tra. – KWeiss

+1

Đây có thể là vấn đề với 'val.key == $ (this) .attr (" value ")'. Điều này có khả năng (có thể do sự kỳ lạ của sự bình đẳng trong Javascript), không bao giờ trả về đúng sự thật. Có lẽ bạn nên sử dụng [===] (http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons). [Gỡ lỗi javascript của bạn] (http://stackoverflow.com/questions/988363/how-can-i-debug-my-javascript-code) và kiểm tra điều này – Liam

+0

Câu hỏi được viết độc đáo BTW, được thực hiện tốt. Nếu chỉ có mỗi người dùng đại diện thấp mới được cân nhắc này – Liam

Trả lời

6

Bạn có bối cảnh sai this bên each. nó không còn là yếu tố trong xử lý nhấp chuột

Hãy thử

$('#table').on('click', 'input[type="checkbox"]', function() { 
    var found = false; 
    var value = $(this).val();// store value from `this` before entering `each` 
    $.each(selected.items, function(i, val) { 
     if (val.key == value) { 
      selected.items.splice(i ,1); 
      found = true; 
      return false; //step out of each() 
     } 
    }); 
    .... 
+0

[Đừng dùng cặp song sinh độc ác] (http://stackoverflow.com/a/359509/542251) – Liam

+0

Đó chính xác là nguyên nhân gốc rễ của vấn đề. – Sam32

+0

@ Sam32 chắc chắn nên sử dụng '===' như liam chỉ ra. Tôi không muốn thay đổi mã của bạn rất nhiều ... chỉ cần chỉ ra các * "tại sao" * đó là quan trọng hơn đôi khi hơn học tất cả các cách thức mới để làm điều đó và không nhận được để root của vấn đề ban đầu – charlietfl

3

Trước tiên, tôi muốn giới thiệu để sử dụng một đối tượng giá trị khóa cặp, vì nó là cách dễ dàng hơn để tra cứu.

var selected = { items : {} }; 

cách này, bạn sẽ truy cập vào các mục đã chọn bằng cách sử dụng

selected.items[my.key] 

lẽ somethink như thế này ...

var selected = {items:{}};  
$('#table').on('change', 'input[type="checkbox"]', function() { 
    var checked = $(this).is(":checked"), 
     title = $(this).data("data-title"), 
     value = $(this).val(); 

    if (checked && !selected.items[value]) 
     selected.items[value] = title; 
    else if (!checked && !!selected.items[value]) 
     delete selected.items[value]; 
}); 
0

thế nào về vấn đề này một:

var selected = { items:[] }; 

$('#table').on('click', 'input[type="checkbox"]', function() { 
    selected.items = $('#table input[type="checkbox"]:checked').map(function(){ 
     return { 
      key: $(this).attr('value'), 
      value: $(this).attr('data-title') 
     } 
    }).toArray() 
}); 
Các vấn đề liên quan