2013-11-13 2 views
0

Я пробовал около 10 ответов на другие вопросы здесь, но ничего не работает. Я пробовал каждый, а также карту и grep.не удалось обновить значение в литеральном объекте Javascript, а затем обновить страницу

Я хочу изменить значение в литературе объекта, а затем обновить список.

Вот массив:

goals = [ 
    { 
    goalguid: "691473a7-acad-458e-bb27-96bac224205b", 
    category: "personal", 
    datecreated: "2013-10-20", 
    startdate: "2013-10-28", 
    enddate: "2013-11-26", 
    goal: "go to store", 
    icon: "cart", 
    status: "completed", 
    username: "jtmagee", 
    userguid: "0c7270bd-38e8-4db2-ae92-244de019c543" 
    }, { 
    goalguid: "9e693231-e6d8-4ca9-b5c8-81ea7a80a36a", 
    category: "personal", 
    datecreated: "2013-10-20", 
    startdate: "2013-10-27", 
    enddate: "2013-11-27", 
    goal: "Brush Teeth", 
    icon: "doctor", 
    status: "inprogress", 
    username: "jtmagee", 
    userguid: "0c7270bd-38e8-4db2-ae92-244de019c543" 
    }, { 
    goalguid: "8d23005d-f6f3-4589-bb85-a90510bccc21", 
    category: "work", 
    datecreated: "2013-10-20", 
    startdate: "2013-10-26", 
    enddate: "2013-11-28", 
    goal: "Arrive on Time", 
    icon: "alarm", 
    status: "inprogress", 
    username: "jtmagee", 
    userguid: "0c7270bd-38e8-4db2-ae92-244de019c543" 
    }, { 
    goalguid: "ac879673-19eb-43f6-8b95-078d84552da0", 
    category: "school", 
    datecreated: "2013-10-20", 
    startdate: "2013-10-24", 
    enddate: "2013-11-29", 
    goal: "Do Math Homework", 
    icon: "book", 
    status: "missed", 
    username: "jtmagee", 
    userguid: "0c7270bd-38e8-4db2-ae92-244de019c543" 
    } 
]; 

Я манипуляция от goalguid в расставшись с литиево, что пользователь нажал. Я использую ключ статуса для изменения классов на ли.

Вот мой JQuery, который ловит щелчок на флажке:

$(".goals").delegate("input[type=checkbox]", "click", function() { 
    goalguid = $(this).parent().parent().data("goalguid"); 
    emailGoal = $(this).parent().data('goal'); 
    if ($(this).prop("checked")) { 
    $(this).parent().parent().removeClass("inprogress missed").addClass("completed").prop("checked", true); 
    updateStatus = 'completed'; 
    return updateTheGoal(); 
    } else { 
    $(this).parent().parent().removeClass("completed").addClass("inprogress").prop("checked", false); 
    updateStatus = 'inprogress'; 
    return updateTheGoal(); 
    } 
}); 

Вот что я не могу работать. Некоторые попытки полностью очистили массив, но большинство, в том числе и это, ничего не делают, кроме того, что мой список мигает. Функция displayGoalList отлично работает для других целей.

updateTheGoal = function() { 
    var goalList; 
    $.each(goals, function() { 
    if (goals.goalguid === goalguid) { 
     return goals.status === updateStatus; 
    } 
    }); 
    goals = JSON.parse(localStorage["goals"]); 
    goalList = $.grep(goals, function(e) { 
    return e.userguid === userguid; 
    }); 
    localStorage.setItem(userguid + "Goals", JSON.stringify(goalList)); 
    logSummary(); 
    return displayMyGoalList(); 
}; 

Любая помощь очень ценится. Благодарю.

+0

Вы можете также добавить HTML, который вы используете? Я попытался воспроизвести проблему, а затем попытаюсь найти решение. Это может быть просто царапина. Просто чтобы воспроизвести это и проверить в jsfiddle например;) – scx

+0

Я не совсем уверен, что вы пытаетесь сделать, но ваш 'каждый' буквально ничего не делает. Он содержит оператор 'if' и return, который никогда не используется (он фактически просто потенциально прерывает цикл). Кроме того, вы проверяете свойства массива, а не элементы в массиве. –

ответ

0
$.each(goals, function() { 
    if (goals.goalguid === goalguid) { 
     return goals.status === updateStatus; 
    } 
}); 

Вы проверяете goals.goalguid и установка goals.status. Это не верно. goals - массив. Ваша цель - проверить каждый элемент в массиве. Тогда вы на самом деле ничего не делаете с возвращением. return в пределах each просто разбивает цикл или продолжает его (в зависимости от возвращаемого значения). Я думаю, вы хотели назначить его. Попробуйте это:

$.each(goals, function(i, el) { 
    if (el.goalguid === goalguid) { 
     el.status = updateStatus; 
     return false; // break the each 
    } 
}); 

Кроме того, удалить этот бит, который заменит любые изменения, сделанные ваших each с любым хранятся в локальном хранилище:

goals = JSON.parse(localStorage["goals"]); 
+0

Ваш ответ сработал отлично. Заметка о JSON.parse заставило меня понять, что мне нужен мой setItem. Кроме того, очевидный начинающий вопрос: поэтому я должен предоставить счетчик для каждого, а el является заполнителем для элементов в массиве, который он подсчитывает? Наконец, не уверен в протоколе: должен ли я обновлять вопрос с помощью кода, поскольку он работал для меня, поэтому будущие читатели могут увидеть, что ваше решение интегрировано в него? Большое спасибо @ james-montagne – charliemagee

+0

Uh-oh. Теперь я могу только нажать на один элемент в моем списке. Я не могу снять его или проверить другие предметы. – charliemagee

+0

Да, это решение работает только один раз. Он только изменяет и обновляет объект при первом щелчке. Ничего. Я попытался добавить .checkboxradio («refresh») в конце изменения класса и возвращает поля и изменение класса, но затем я теряю обновление объекта. – charliemagee

Смежные вопросы