Сначала вы должны разыграть записи в массиве.
const raffles = [{"author":"Name","rafflename":"RAFFLE","amount":"10","entries":"[]"}]
// cast entries to Array
raffles[0].entries = JSON.parse(raffles[0].entries)
// now you can push them
raffles[0].entries.push('test')
console.log(raffles)
Корректный!
Кроме того, можно выставить два метода: BeginEdit - В этом методе, Ваша метка Ваш Флаг IsDirty к Истинному. Значение Вас делает модификацию. Назовите этот метод, когда Вы соберетесь сделать модификации
CancelEdit - В этом методе, сброс Флаг IsDirty ко Лжи. Значение Вас имеет arborted процесс редактирования и вернулось назад к исходному состоянию. Назовите этот метод при отмене любых сделанных модификаций.
И после того как любые модификации сохраняются, Вы также сбрасываете Флаг IsDirty ко Лжи.
Я надеюсь, что это помогает.
При использовании платформы.NET можно хотеть смотреть на платформу.NET CSLA Рокфордским Lhotka: http://www.lhotka.net/cslanet/Default.aspx
CSLA является сформировавшейся платформой, которая включает объектное управление состоянием (IsDirty), функциональность отмены, привязка данных и намного больше, плюс он является бесплатной и с открытым исходным кодом.
Если у Вас будет ряд объектов, которые редактируются затем, то Вам, вероятно, будут нужны что-то большее чем булев флаг для isDirty (). Эта проблема не отличается от подсчета ссылок, т.е. увеличьте грязное количество на редактировании и декремент на отмене. Если Вы поддерживаете отмену, я подозреваю, что Вы собираетесь закончить некоторую довольно волосатую логику. Я не допустил бы его в Ваши объекты области.
Существует несколько интерфейсов, что Вы могли реализовать ту справку с отслеживанием изменений и отменой: INotifyPropertyChanged и IEditableObject. Оба из этих интерфейсов позволяют объекту играть по правилам с привязкой данных.
public class Person : INotifyPropertyChanged, IEditableObject
{
private bool isDirty;
public bool IsDirty
{
get { return isDirty; }
}
private string firstname = string.Empty;
public string Firstname
{
get { return firstname; }
set
{
if (firstname == value) return;
firstname = value;
NotifyPropertyChanged("Firstname");
}
}
private string lastname = string.Empty;
public string Lastname
{
get { return lastname; }
set
{
if (lastname == value) return;
lastname = value;
NotifyPropertyChanged("Lastname");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
isDirty = true;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private bool inTrans;
private Person copy;
public void BeginEdit()
{
if (!inTrans)
{
if (copy == null)
copy = new Person();
copy.isDirty = isDirty;
copy.Firstname = Firstname;
copy.Lastname = Lastname;
inTrans = true;
isDirty = false;
}
}
public void CancelEdit()
{
if (inTrans)
{
isDirty = copy.isDirty;
Firstname = copy.Firstname;
Lastname = copy.Lastname;
inTrans = false;
}
}
public void EndEdit()
{
if (inTrans)
{
copy = null;
inTrans = false;
}
}
}
Да, это работает хорошо. Вместо того, чтобы отменять, я использую метод IsDirty, чтобы показать, что что-то, ВОЗМОЖНО, изменило запись, и затем это инициировало мой, "сделал рекордную логику изменения". Я разработал свою собственную платформу, где каждое поле таблицы является на самом деле свойством объекта. Каждый раз, когда поле записано в объекты "isDirty", флаг установлен. В методе "SaveObject" объекта (на самом деле это - класс помощника, но могло легко быть в объекте, но я хотел способность сохранить объекты различными способами, любить к xml, базе данных, ect.), я проверяю IsDirty и если его ложь затем я пропускаю сохранение. Это упрощает логику как каждый раз, когда у меня была возможность изменения объекта, я называю SaveObject и позволяю платформе обработать его.
В зависимости от Вашего домена Вы могли использовать равенство для тестирования на различия. Сохраните исходный объект и сделайте копию объекта для редактирования. Каждый раз, когда редактирование может быть выполнено, изменить UI соответственно.
Преимущество этого предложения - то, что оно не прикрепляет GUI определенная функциональность (isDirty () флаг) на Ваших объектах области, но YMMV
Если Вы поддерживаете операционную отмену на уровне гранулярности, больше, чем 'отмена все, так как в последний раз сохраняют', затем я предложил бы стек отмены. То, когда что-то редактируется, это (или это - операционный функтор отмены, или делегат) добираются, добавило к стеку. Когда Вы отменяете, Вы просто выталкиваете стек и отменяете вытолканную операцию. Ваш isDirty () флаг является затем просто проверкой, если стек отмены содержит объекты, а не дополнительное устройство хранения данных и логику для обновления.