2017-01-12 2 views
4

У меня есть форма редактирования, и я хочу, чтобы кнопка «Сохранить» была отключена до тех пор, пока не будет сделано редактирование для одного из свойств, связанных с элементом ввода или выбора ,Предоставляет ли Aurelia какой-либо индикатор Dirty, основанный на исходном значении свойства

Однако, если пользователь редактирует текст до первоначального значения, форма больше не должна считаться грязной.

Пример:

  1. Первоначальная стоимость: "Тест" - Не Грязный
  2. Пользователь редактирует ввод и изменения значения: "Тест 2" - Dirty
  3. Пользователь редактирует ввод снова и изменение значения вернуться к «Тест» - Не Грязный

Я видел this пост, который описывает, как создать dirtyBindingBehavior, но это только сравнивает новое значение, что там было раньше - в этом случае, линь e 3 выше приведет к по-прежнему перечислять форму как Dirty, поскольку она будет сравнивать старое значение «Test 2» с новым значением «Test».

Любые идеи о том, как это сделать?

ответ

5

Вам просто нужно сделать копию объекта и создать свойство getter, которое сравнивает старый объект с новым объектом (используйте @computedFrom, чтобы избежать грязной проверки). Например:

import {computedFrom} from 'aurelia-framework'; 

export class App { 

    oldModel = new Model(); 
    newModel = deepClone(this.oldModel); 

    @computedFrom('newModel.name', 'newModel.surname') 
    get hasChanged() { 
    return !isEqual(this.oldModel, this.newModel); 
    } 

} 

function deepClone(obj) { 
    return JSON.parse(JSON.stringify(obj));; 
    //use Object.assign({}, obj) if you don't need a deep clone 
} 

function isEqual(obj1, obj2) { 
    return JSON.stringify(obj1) === JSON.stringify(obj2); 
} 

class Model { 
    //something from database; 
    name = 'John'; 
    surname = 'Doe'; 
} 

Запуск Пример https://gist.run/?id=d9f7ee41f4448d7981351c7e222d7388

+0

идеальный! Спасибо – RHarris

+0

Если это решает вашу проблему, отметьте ее как ответ, чтобы помочь другим людям –

+0

В большинстве случаев вы можете просто сохранить сериализованную копию и сравнить ее. Используйте только JSON.stringify в «deepClone» и сохраните версию строки в oldModel. Теперь реализуем «isEqual» со ​​строковым сравнением, снова вызывающим JSON.striginfy на newModel. –