2015-12-15 3 views
2

У меня есть объект пользователя, и я хочу отслеживать изменения в случае, если пользователь редактирует их информацию, однако они могут сказать «отказаться от изменений» и вернуться к предыдущему состоянию объекта пользователя при загрузке._.deepClone объекта, не соответствует старому объекту?

Мое решение было deepClone исходный объект в резервный вар, чтобы дать ему это собственные опорные точки, а затем сравнить объект пользователя на объект резервного --- снова используя lodash

Я наблюдаю за объектом с помощью угловой # $ watch, и если! _. isEqual (пользователь, резервная копия).

$scope.$on '$routeChangeStart', (e, next) -> if !_.isEqual(user, backup) console.log 'changes made'

Однако это возвращает ложь, даже если нет никаких изменений? Кажется, что два объекта уже не равны, хотя все ключи и значения идентичны? Я предполагаю, что происходит больше, чем то, что я вижу, когда я глубоко закрываю.

Любые лучшие подходы? И что я делаю неправильно?

+0

Можете ли вы поместить схему для ваших объектов? – TbWill4321

ответ

0

Проблема, скорее всего, user был изменен как угловой. Угловая добавляет некоторые свойства для отслеживания объектов, связанных с представлением (эти свойства начинаются с $ или $$). Если у ваших объектов нет таких «родных» свойств, вы можете сначала попытаться сделать deepOmit на user.

0

Это классический пример, когда концепция неизменности могла бы помочь. Если бы ваш объект был неизменным, его копия означала бы только указатель на исходный объект, и, на мой взгляд, сравнение было бы более надежным. Проверьте https://facebook.github.io/immutable-js/, если вы хотите узнать, почему facebook его принял (и, возможно, попытайтесь использовать его самостоятельно).

+1

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/10575950) – Benjamin

+0

@Benjamin Я знаю, что он не затрагивает вопрос прямо, но он фокусируется на * Любые лучшие подходы? *. – vikeri