I've been chasing this bug down for a week now and I'm about to tear my
hair out.
This should be about the simplest thing in the world.
I've got a CMS I'm working on, completely custom deal for an inhouse
replacement for sharepoint.
The front-end is pure angular, there are no "non-angular" bits involved.
As part of the CMS I have written a module to create and display custom
forms.
These forms are then stored to the database as JSON object which describes
their construction and then displayed to the user via a custom directive.
Everything works really good, except that I have given users the ability to
custom databind certain variables off the rootScope, and while those
variables display correctly, they do not appear to be updating when I go to
persist them.
The directive is something I pulled from a similar post on stack exchange.
.directive('dynamicModel', ['$compile', function ($compile) {
return {
'link': function(scope, element, attrs) {
scope.$watch(attrs.dynamicModel, function(dynamicModel) {
if (attrs.ngModel == dynamicModel || !dynamicModel)
return;
element.attr('ng-model', dynamicModel);
if (dynamicModel == '') {
element.removeAttr('ng-model');
}
// Unbind all previous event handlers, this is
// necessary to remove previously linked models.
element.unbind();
$compile(element)(scope);
});
}
};
}])
This is used in the following way...
<li class="list-group-item fade-in" ng-repeat="field in currentForm.fields"
>
<label>{{field.displayname}}
<span ng-if="field.type != 'list' && field.type !='image' &&
field.type !='range' && field.type != 'number'">
<input class="form-control" type="{{field.type}}" name=
{{field.name}} value="{{field.value}}" dynamic-model="field.databind"
required="{{field.isRequired}}">
</span>
</label>
</li>
Note that currenfForm.fields is rootScope, and field.databind if it exists,
will also refer to a rootScope variable such as
$rootScope.currentUser.email however the actual content of field.databind
would be "currentUser.email"
The problem I have, is that when I submit the form I preserve all globals,
but the field isn't present on the global.
This seems to be a problem if we are binding to something that wasn't
previously part of the original global. For instance my profile form has a
.displayname field. Since it's the user's first time filling out the
profile, We won't have currentUser.displayname yet, and so rootScope
doesn't get one added. Instead there seems to be local scope.currentUser
which is created. but then it only has the fields relevant to the form. I
can't persist that because it doesn't have the requisite fields like ._id
that I need, and also it only has the fields declared in the form.
So in short, it appears that for better or worse, I have 2 currentUser
objects. One rootScope.currentUser which contains the bulk of currentUser
info, and then scope.currentUser which contains only the variables within
the form.
I need to merge them and keep them in sync, or better yet ditch the local
copy and make sure my form databinds are always on the global scope even if
the global scope variable didn't exist yet.
Thanks for any advice!
--
You received this message because you are subscribed to the Google Groups
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.