1

Как я могу сохранить данные с одного взгляда на другой в angularjs?Сохранить данные в форме

я сделал $ rootScope

+0

До сих пор не удалось решить эту проблему. Я не хочу переделывать весь свой webapp, чтобы как-то сохранить вкладку формы. Должен быть быстрый способ сделать это. Любая помощь приветствуется! –

ответ

1

Из того, что я вижу, вы используете 2 различные контроллеры для каждого вида (или один для зрения и ни для вида корня).

Проблема заключается в том, что Angular не может обмениваться данными между такими контроллерами.

Вы должны либо использовать сервис/завод, или использовать rootscope, но не как вы это делали, а с broadcast и emit

Если бы я тебя, я хотел бы использовать службу.

EDIT Здесь вы идете, сервис для вас:

(function() { 
'use strict'; 
angular 
    .module('YourModuleName') 
    .factory('CountriesService', CountriesService); 
CountriesService.$inject = ['Your', 'dependencies', 'here', 'in', 'string']; 
/* @ngInject */ 
function CountriesService(your, dependencies, here, not, in, string) { 

    var service = { 
     setCountries: setCountries, 
     getCountries: getCountries 
    }; 

    var vm = this; 
    vm.countries = []; // Or maybe an object ? 
    // ... List of other variables you need to store. 

    return service; 
    //////////////// 
    function setCountries(listOfCountries) { 
     vm.countries = listOfCountries; 
    } 

    function getCountries() { 
     return vm.countries; 
    } 
} 
})(); 

Это сохранит ваши переменные. В вашем контроллере вы добавляете CountriesService в качестве зависимости, чтобы сэкономить вам CountriesService.setCountries и для загрузки вы используете CountriesService.getCountries. Имейте в виду, что обновление страницы приведет к удалению всех данных!

EDIT НОМЕР 2 Если ты боишься John papa guidelines, вот простой сервис, вы можете использовать в том же файле вы кладете контроллер:

app.factory('CountryControl', function(your, dependencies) { 

     var service = { 
      setCountries: setCountries, 
      getCountries: getCountries 
     }; 


     this.countries = []; // Or maybe an object ? 
     // ... List of other variables you need to store. 

     return service; 
     //////////////// 
     function setCountries(listOfCountries) { 
      this.countries = listOfCountries; 
     } 

     function getCountries() { 
      return this.countries; 
     } 
    }); 
+0

У меня только 1 контроллер, и я передаю его в routeProvider для подробной страницы. Я действительно не знаю, как настроить службу из моего кода. Не могли бы вы привести несколько примеров? Кстати, должен ли я загружать всю свою папку веб-сайта где-нибудь для вас? Может быть, вам легче увидеть страницу перед вами. –

+0

Nah Я хороший, я просто отправлю вам сервис и покажу вам, как его использовать. Вы должны вникать в это, вы найдете много обучающих онлайн. Хорошо, подождите секунду, я отредактирую свой ответ. – trichetriche

+0

@ rickastley здесь вы идете, см. Редактирование. – trichetriche

0

У меня есть приложение, которое делает это более или менее. Служба исправляет это красиво. И создает такой механизм, что вы можете сделать это в любом месте своего приложения.

Во-первых, я бы рекомендовал не пытаться управлять этим с помощью области. Просто поставьте объект на свой контроллер (myFormObj) и добавьте свойства, которые вы хотите ему (имя, ранг, серийный номер и т. Д.).

Затем привяжите поля ввода формы к свойствам этого объекта (в отличие от областей видимости). Таким образом, ваши модели ng-model будут выглядеть как myCtl.formObj.name и так далее.

Когда пользователь запускает событие, которое изменяет представление, сохраните COPY (угловую копию) этой формыObj в сторону, как правило, в службе (подумайте FormStateService или что-то в этом роде). FormStateService не мог сделать ничего, кроме простого массива.

this.forms = { 'TheNameOfYourForm' : theFormObjToSave }; 

Таким образом, когда пользователь запускает это событие, которое оставляет форму, вы просто делаете это:

formStateSvc.forms [ 'NameOfMyForm'] = angular.copy (theFormObj);

Когда пользователь возвращается к первоначальному виду и контроллер инициализируется, вы просто спросите formStateSvc:

if ('NameOfMyForm' in formStateSvc.forms) { 
    this.formObj = formStateSvc.forms [ 'NameOfMyForm' ]; 
} 

Вуаля, ваша старая форма состояние восстанавливается.

Более надежно, вы можете создать методы «addForm, removeForm» и т. Д., Вы можете обеспечить защиту от таких вещей, как неопределенные, и вы можете сделать повторную привязку к прежнему состоянию неявным (когда контроллер вашей формы находится, просто попросите его восстановить если есть, чтобы восстановить).Таким образом, ваш контроллер будет иметь:

this.formObj = formStateSvc.rebindOldDataIfItExists ('MyFormName');

Вы получаете идею.

0

Простой подход заключается в создании объекта поставщика значения и опубликовать его на сфере:

//Create value provider object 
app.value("FormObj", {}); 

app.controller("myController", function($scope, FormObj) { 
    //Publish on scope 
    $scope.FormObj = FormObj; 
}); 

Тогда имеет ng-model директивы использовать этот объект:

Name <input ng-model="FormObj.name"><br> 
Rank <input ng-model="FormObj.rank"><br> 
SerialNum <input ng-model="FormObj.ssnum"><br> 

Объект значения одноэлементен который сохраняется для жизни приложения. Изменения в содержимом объекта будут сохранены и доступны другим контроллерам и сохранят изменения в представлении.

DEMO on PLNKR