From 61f891d3ed71111f4b0474ad07bccb5cf625abd3 Mon Sep 17 00:00:00 2001 From: Karol Wypchlo Date: Thu, 10 Mar 2016 11:23:58 +0100 Subject: [PATCH] fix(model): keep track of correct model reference --- src/directives/formly-form.js | 9 ++++----- src/directives/formly-form.test.js | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/directives/formly-form.js b/src/directives/formly-form.js index 52895442..9386d7ad 100644 --- a/src/directives/formly-form.js +++ b/src/directives/formly-form.js @@ -42,7 +42,7 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol ${getHideDirective()}="!field.hide" class="formly-field" options="field" - model="field.model" + model="field.model || model" original-model="model" fields="fields" form="theFormlyForm" @@ -140,7 +140,7 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol const promise = field.runExpressions && field.runExpressions() if (field.hideExpression) { // can't use hide with expressionProperties reliably const val = model[field.key] - field.hide = evalCloseToFormlyExpression(field.hideExpression, val, field, index) + field.hide = evalCloseToFormlyExpression(field.hideExpression, val, field, index, {model}) } if (field.extras && field.extras.validateOnModelChange && field.formControl) { if (angular.isArray(field.formControl)) { @@ -261,7 +261,7 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol const model = field.model || $scope.model $scope.$watch(function hideExpressionWatcher() { const val = model[field.key] - return evalCloseToFormlyExpression(field.hideExpression, val, field, index) + return evalCloseToFormlyExpression(field.hideExpression, val, field, index, {model}) }, (hide) => field.hide = hide, true) } } @@ -277,9 +277,8 @@ function formlyForm(formlyUsability, formlyWarn, $parse, formlyConfig, $interpol field.model = resolveStringModel(expression) $scope.$watch(() => resolveStringModel(expression), (model) => field.model = model) - } else if (!field.model) { - field.model = $scope.model } + return isNewModel function resolveStringModel(expression) { diff --git a/src/directives/formly-form.test.js b/src/directives/formly-form.test.js index 0eb6c2ab..ba66ec0a 100644 --- a/src/directives/formly-form.test.js +++ b/src/directives/formly-form.test.js @@ -445,6 +445,7 @@ describe('formly-form', () => { {template: input, key: 'foo', model: scope.fieldModel1}, {template: input, key: 'bar', model: scope.fieldModel1}, {template: input, key: 'zoo', model: scope.fieldModel1}, + {template: input, key: 'test'}, ] }) @@ -462,6 +463,21 @@ describe('formly-form', () => { expect(spy1).to.have.been.calledOnce expect(spy2).to.have.been.calledOnce }) + + it('should be updated when the reference to the model changes', () => { + scope.model = {test: 'bar'} + scope.fields[3].expressionProperties = {'data.test': 'model.test'} + + compileAndDigest() + $timeout.flush() + + scope.model = {test: 'baz'} + + scope.$digest() + $timeout.flush() + + expect(scope.fields[3].data.test).to.equal('baz') + }) }) describe('nested model as string', () => { @@ -498,6 +514,7 @@ describe('formly-form', () => { it('should be updated when the reference to the outer model changes', () => { scope.model.nested.foo = 'bar' scope.fields[0].model = 'model.nested' + scope.fields[0].expressionProperties = {'data.foo': 'model.foo'} compileAndDigest() $timeout.flush() @@ -509,8 +526,9 @@ describe('formly-form', () => { } scope.$digest() + $timeout.flush() - expect(scope.fields[0].model.foo).to.equal('baz') + expect(scope.fields[0].data.foo).to.equal('baz') }) function testModelAccessor(accessor) {