2015-11-06 3 views
0

С помощью этого кода я пытаюсь сделать копию события перед редактированием или любым изменением вида события, чтобы реализовать кнопку отмены, поэтому я скопировал ее в переменную oldValue, но событие и oldValue всегда пусты, потому что (как я думаю) они выполняются до возвращения фабрики событий, которая заполняет переменную событияполучить старое значение области

что я могу сделать для решения этой проблемы?

HTML Event

<sw-event-view event="ev.event" ng-hide="ev.loading" ng-if="ev.view_type == 'event'" ></sw-event-view> 

контроллер Event

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'); 

} 

просмотр событий 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."…} 

ответ

1

Есть несколько способов, которые вы можете вернуться к старым данным в угловых и все ниже включают просто контроллер, а не директивы.

В случае возврата к исходным данным перед любыми изменениями вы можете просто скопировать данные в другую переменную при загрузке и при необходимости заменить измененные данные.

var originalData = angular.copy($scope.data); 

$scope.reset = function() { 
    $scope.data = originalData; 
}; 

Если вы хотите вернуться к данным непосредственно перед событием (т.е. до последнего обновления ngModel), один из вариантов является использование $ Scope. $ Часы постоянно перезаписывать предыдущее значение, сохраненное в переменной.

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> 
+0

Спасибо Дорогой, трюк был в использовании функции $ часов – user2099451