From 7858d4f406936e5bb38f7c516f1edaea0ac6b192 Mon Sep 17 00:00:00 2001 From: Aleksey Verkholantsev Date: Fri, 3 Oct 2014 13:33:41 +0400 Subject: [PATCH 1/3] Object equality in i-model__field.isEqual implemented --- .../i-model/__field/i-model__field.js | 20 +++++++++++++++++++ .../i-model/__field/i-model__field.test.js | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/common.blocks/i-model/__field/i-model__field.js b/common.blocks/i-model/__field/i-model__field.js index 4b77261..7d5461e 100755 --- a/common.blocks/i-model/__field/i-model__field.js +++ b/common.blocks/i-model/__field/i-model__field.js @@ -169,10 +169,30 @@ isEqual: function(value) { value = (this.params.preprocess || this._preprocess).call(this, value); // fixme: preprocess выполняется 2 разе при вызове _set return value === this.get() || + this._isEqualToObject(value) || this.isEmpty() && this.checkEmpty(value) || this.isNaN(value) && this.isNaN(this.get()); }, + _isEqualToObject: function (value) { + var currentValue = this.get(); + if (!$.isPlainObject(currentValue) || !$.isPlainObject(value)) { + return false; + } + + var currentValueKeys = Object.keys(currentValue); + var valueKeys = Object.keys(value); + if (currentValueKeys.length !== valueKeys.length) { + return false; + } + + var keysWithDifferentValues = valueKeys.filter(function (key) { + return value[key] !== currentValue[key]; + }); + + return keysWithDifferentValues.length === 0; + }, + /** * Проверка значения value на пустоту * @param {*} value значение diff --git a/common.blocks/i-model/__field/i-model__field.test.js b/common.blocks/i-model/__field/i-model__field.test.js index db56182..56b658f 100644 --- a/common.blocks/i-model/__field/i-model__field.test.js +++ b/common.blocks/i-model/__field/i-model__field.test.js @@ -263,6 +263,11 @@ BEM.TEST.decl('i-model__field', function() { simpleField.set(NaN).fixData(); expect(simpleField.isEqual(NaN)).toBe(true); }); + + it('should return true if field value equal to object', function () { + simpleField.set({isTrue: true}).fixData(); + expect(simpleField.isEqual({isTrue: true})).toBe(true); + }); }); describe('.isChanged()', function() { From 76d0339631df925112544aac0ac88f8b6d89ffb8 Mon Sep 17 00:00:00 2001 From: Aleksey Verkholantsev Date: Fri, 3 Oct 2014 13:35:17 +0400 Subject: [PATCH 2/3] Jsdoc to i-model__field._isEqualToObject() added --- common.blocks/i-model/__field/i-model__field.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common.blocks/i-model/__field/i-model__field.js b/common.blocks/i-model/__field/i-model__field.js index 7d5461e..30b7da8 100755 --- a/common.blocks/i-model/__field/i-model__field.js +++ b/common.blocks/i-model/__field/i-model__field.js @@ -174,6 +174,11 @@ this.isNaN(value) && this.isNaN(this.get()); }, + /** + * + * @param {*} value + * @return {Boolean} + */ _isEqualToObject: function (value) { var currentValue = this.get(); if (!$.isPlainObject(currentValue) || !$.isPlainObject(value)) { From 04bc5f6bb2a4bb915a8de960fc03e0886520ade4 Mon Sep 17 00:00:00 2001 From: Aleksey Verkholantsev Date: Wed, 8 Oct 2014 15:22:55 +0400 Subject: [PATCH 3/3] Multivar fixed --- common.blocks/i-model/__field/i-model__field.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/common.blocks/i-model/__field/i-model__field.js b/common.blocks/i-model/__field/i-model__field.js index 30b7da8..809d94c 100755 --- a/common.blocks/i-model/__field/i-model__field.js +++ b/common.blocks/i-model/__field/i-model__field.js @@ -180,18 +180,22 @@ * @return {Boolean} */ _isEqualToObject: function (value) { - var currentValue = this.get(); + var currentValue = this.get(), + currentValueKeys, + valueKeys, + keysWithDifferentValues; + if (!$.isPlainObject(currentValue) || !$.isPlainObject(value)) { return false; } - var currentValueKeys = Object.keys(currentValue); - var valueKeys = Object.keys(value); + currentValueKeys = Object.keys(currentValue); + valueKeys = Object.keys(value); if (currentValueKeys.length !== valueKeys.length) { return false; } - var keysWithDifferentValues = valueKeys.filter(function (key) { + keysWithDifferentValues = valueKeys.filter(function (key) { return value[key] !== currentValue[key]; });