diff --git a/common.blocks/i-model/__field/i-model__field.js b/common.blocks/i-model/__field/i-model__field.js index 4b77261..809d94c 100755 --- a/common.blocks/i-model/__field/i-model__field.js +++ b/common.blocks/i-model/__field/i-model__field.js @@ -169,10 +169,39 @@ 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()); }, + /** + * + * @param {*} value + * @return {Boolean} + */ + _isEqualToObject: function (value) { + var currentValue = this.get(), + currentValueKeys, + valueKeys, + keysWithDifferentValues; + + if (!$.isPlainObject(currentValue) || !$.isPlainObject(value)) { + return false; + } + + currentValueKeys = Object.keys(currentValue); + valueKeys = Object.keys(value); + if (currentValueKeys.length !== valueKeys.length) { + return false; + } + + 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() {