2015-01-04 3 views
0

У меня есть шаблон, в котором мне нужен текст редактирования и список допустимых_thimes (этот рассчитывается в зависимости от даты редактирования).

я узнал, что код контроллера кажется только один раз запустить и не тогда, когда я делаю $ state.go (

Наблюдая за умник видео-х я видел, что решимость (в состоянии) используется для перед тем, как открыть форму, перед тем, как открыть форму. С кодом, который у меня есть, перед тем, как загрузится текст редактирования (то же самое с allow_times), будет установлен параметр $ scope.timesheet. То же самое можно сделать с допустимыми_times.Как я могу это исправить?

В моей службе У меня есть этот код:

.factory('Timesheets', function($resource, $rootScope, LinkData, Company) { 
    var Timesheet = $resource('http://127.0.0.1:3000/api/v1/timesheets/:id',{id:'@id'}, {update:{method:'PUT'}}); 
    var _allowed_times; 

    return { 
    timesheet: function() { 
     return Timesheet; 
    }, 
    allowed_times: function() { 
     return this._allowed_times 
    }, 
    get: function(id){ 
     return Timesheet.query({q: {id_eq: id}}).$promise.then(function (data, status) { 
     this.editingTimesheet = data; 
     Company.allowed_times(data.currentDate).then(function(data2) { //fill allowed times 
      this._allowed_times = data2; 
     }); 
     }); 
    } 
    } 
}) 

В контроллер у меня есть это:

var TimesheetDetailCtrl = app.controller('TimesheetDetailCtrl', function($scope, Timesheets) { 
    $scope.allowed_times = Timesheets.allowed_times(); 
    $scope.timesheet = Timesheets.editingTimesheet; 
} 

Я также получил эту функцию, я карту, чтобы решить в .state:

TimesheetDetailCtrl.beforeShow = function($q, $stateParams, Timesheets) { 
    Timesheets.get($stateParams.timesheetId); 
}; 

И, наконец, у меня есть такое состояние:

.state('timesheet-detail', { 
    url: '/timesheet/:timesheetId', 
    templateUrl: 'templates/timesheet-detail.html', 
    controller: 'TimesheetDetailCtrl', 
    resolve: { 
     reset: TimesheetDetailCtrl.beforeShow 
    } 
}) 

Дополнительный вопрос: функция beforeShow будет выполняться каждый раз при загрузке шаблона. Код в контроллере нет:

$scope.timesheet = Timesheets.editingTimesheet; 

я правильно предполагая, что при изменении Timesheets.editingTimesheet, он будет автоматически также изменить $ scope.timesheet и поэтому код в контроллере не нужно будет работать каждый раз?

ответ

0

Я вижу пару проблем здесь.

  1. Вы не можете пройти $rootScope на заводской основе. Вы можете передать $rootScope или «$ scope» на заводский метод от контроллера или так далее. Фабрики - это одноточие. например Timesheets.allowed_times($scope)

  2. Определение разрешения не представляется подходящим.

Опция решительность принимает объект, где ключи являются имена зависимостей, чтобы ввести в контроллер и значения являются заводы, которые должны быть решены. Итак, решение оценивается до инициализации контроллера.

Я думаю, что вам нужно сделать следующие изменения в код

.state('timesheet-detail', { 
    url: '/timesheet/:timesheetId', 
    templateUrl: 'templates/timesheet-detail.html', 
    controller: 'TimesheetDetailCtrl', 
    resolve: { 
     reset: ['$stateParams', 'Timesheets', function($stateParams, Timesheets){ 
     Timesheets.get($stateParams.timesheetId); 
     }; 
    } 
}) 

Вы не можете требовать TimesheetDetailCtrl.beforeShow метода здесь.

ИЛИ

Вы можете просто изменить свой конструктор контроллера, как указано ниже, и удалите resolve

var TimesheetDetailCtrl = app.controller('TimesheetDetailCtrl', ['$scope', '$stateParams', 'Timesheets', function($scope, $stateParams, Timesheets) { 
    Timesheets.get($stateParams.timesheetId); 
    $scope.allowed_times = Timesheets.allowed_times(); 
    $scope.timesheet = Timesheets.editingTimesheet; 
])}; 

Что касается дополнительных вопросов ... Я считаю, конструктор контроллер работает при каждой загрузке шаблона ,

$scope.timesheet = Timesheets.editingTimesheet; 

при изменении Timesheets.editingTimesheet, $ scope.timesheet не изменится в вашем случае, как ваш всегда получает новый объект «данные». Если вы держите ссылку в целости, то только она работает.

Необходимо изменить текст редактирования на объект, содержащий данные. , например.

Timesheets.editingTimesheet = {tsInstance: data} 
$scope.timesheet = Timesheets.editingTimesheet; 
in html, access with 
{{timesheet.tsInstance}} 
0

Наконец-то я нашел ответ. Я использую Ionic beta 14, и они активировали кешированные представления.

Смотрите здесь для подробностей: http://ionicframework.com/docs/api/directive/ionNavView/

Соответствующая часть: Обратите внимание, что, поскольку мы кэшируем эти взгляды, мы не разрушив областей. Вместо этого области отключаются от цикла просмотра. Поскольку области не разрушаются и воссозданы, контроллеры не загружаются снова при последующем просмотре.

После отключения кэширования в состояние поставщика все работало, как ожидалось:

Отключить кэш в состояние поставщика

$stateProvider.state('myState', { 
    cache: false, 
    url : '/myUrl', 
    templateUrl : 'my-template.html' 
}) 
Смежные вопросы