This is part of my form:
<form name="form.activityForm" class="form-horizontal" ng-submit="save(form.activityForm.$valid)"
enctype="multipart/form-data" novalidate>
<fieldset>
<div class="form-group" ng-if="!activity._id">
<label for="gpxData" ng-class="{ 'disabled': gpxFileName }" class="btn btn-primary btn-file">Upload GPX
<input type="file" nv-file-select name="gpxData" id="gpxData" ng-model="gpxData" uploader="uploader"
onchange="angular.element(this).scope().setFileName()" hidden>
</label>
<span ng-if="gpxFileName" ng-bind="gpxFileName"></span>
</div>
<div class="form-group" show-errors>
<label class="control-label" for="name">Name</label>
<input name="name" type="text" ng-model="activity.name" id="name" class="form-control"
ng-disabled="!gpxFileName" required>
<div role="alert" class="alert alert-danger" ng-if="(activity.name === 'N/A') && (gpxFileName)">
<p>This activity does not have a <strong>name</strong>. Please select one.</p>
</div>
<div ng-messages="form.activityForm.name.$error" role="alert">
<p class="help-block error-text" ng-message="required">Activity name is required.</p>
</div>
</div>
...
</fieldset>
</form>
setFileName()
$scope.setFileName = () => {
let fr = new FileReader(),
gpxFile = document.getElementById("gpxData").files[0],
filename = gpxFile.name;
fr.onload = () => {
let gpxDataXml = parseXmlFromString(fr.result);
setNameTypeDescription(gpxDataXml.documentElement);
};
fr.readAsText(gpxFile);
$scope.gpxFileName = filename;
};
setNameTypeDescription()
let setNameTypeDescription = (gpxDataXmlDocumentElement) => {
let activityType = getSingleTagData(gpxDataXmlDocumentElement, "type");
$scope.activity.name = getSingleTagData(gpxDataXmlDocumentElement, "name");
$scope.activity.description = getSingleTagData(gpxDataXmlDocumentElement, "descr");
$scope.activityTypes.forEach((type) => {
if (type.name.toLowerCase() === activityType.toLowerCase()) {
$scope.activity.type = type;
}
});
};
When I log out the values (i.e. $scope.activity.name
) after they have been changed in the controller, I get the expected output. However, the values (i.e. ng-model="activity.name"
) in the template do not update until there is focus again on the page (i.e. clicking a button)
EDIT:
To add, I need to use ng-model
as I need 2 way binding. Even though the value is originally set int the controller, the user can also change the value in the template and, on form submit, that value gets saved into mongo.
Also, ng-bind
is not working in this scenario.