В этом коде я пытаюсь выполнить копию события перед редактированием или любое изменение в представлении события, чтобы реализовать кнопку отмены, поэтому я скопировал ее в переменную oldValue, но событие и oldValue всегда пусты, потому что (как я думаю) они выполнить перед возвратом фабрики событий, которая заполняет переменную события
что я могу сделать для решения этой проблемы?
Событие html
<sw-event-view event="ev.event" ng-hide="ev.loading" ng-if="ev.view_type == 'event'" ></sw-event-view>
Контроллер событий
angular.module('App')
.controller('EventCtrl', function ($scope, $state, $http, EventFactory) {
ev.event = {};
console.log('controller start');
ev.view_type = 'event';
EventFactory.getEvent(1)
.then( function(r) {
ev.event = r.data.data.event;
console.log('event controller',ev.event);
ev.loading = false;
} ,handleHttpError);
console.log('end of controller');
}
event html
<div>Something</div
<sw-basic-info ng-show="!edit_mode && selected_tab == 'basic info'" event="event"></sw-basic-info>
<sw-locations-list ng-show="(selected_tab == 'locations') && !edit_mode" locations="event.locations"></sw-locations-list>
директива просмотра событий
angular.module('App')
.directive('swEventView', function (EventFactory) {
return {
scope: {
event: "=",
},
templateUrl: 'template url',
restrict: 'E',
link: function (scope, element, attrs) {
console.log('event view scope.event', scope.event);
scope.oldValue = angular.copy(scope.event);
console.log('event view scope.oldValue', scope.oldValue);
}
}
фабрика событий
angular.module('App')
.factory('EventFactory', function ($http, $q) {
var getEvent = function (id) {
console.log('event factory', id);
return $http.get(server + "event/"+id);
}
}
То, что я вижу в журнале
controller start
event factory 1
end of controller
event view scope.event Object {}
event view scope.oldValue Object {}
event controller
Object {id: 1, event_code: "5020048072", name: "Heathcote", short_name: "Hea", description: "Dolor unde molestiae fuga culpa aut excepturi iste et esse tempore illo quia quod aut."…}
Существует несколько способов вернуть старые данные в угловом и все нижеследующие, которые включают только контроллер, а не директивы.
В случае возврата к исходным данным перед любыми изменениями вы можете просто скопировать данные в другую переменную при загрузке и при необходимости заменить измененные данные.
var originalData = angular.copy($scope.data);
$scope.reset = function() {
$scope.data = originalData;
};
Если вы хотите вернуться к данным непосредственно перед событием (т.е. До последнего обновления ngModel), одним из вариантов является использование $ scope. $ Watch, чтобы постоянно перезаписывать предыдущее значение, хранящееся в переменной.
var prevData;
$scope.$watch('data', function (nv, ov) {
// Add to history (create a copy)
prevData = angular.copy(ov);
}, true);
$scope.reset = function() {
$scope.data = prevData;
};
Или для ввода вы можете использовать $rollbackViewValue()
$scope.cancel = function(e) {
// if the escape key pressed
if (e.keyCode == 27) {
$scope.formName.fieldName.$rollbackViewValue();
}
};
Html будет
<form name="formName" role="form">
<input type="number" class="form-control" name="fieldName" ng-model="data" ng-model-options="{updateOn: 'blur'}" ng-keyup="cancel($event)">
</form>