Мне нужно передать значение области в службу, то, что я сейчас делаю, - это убрать функцию обслуживания в контроллере и передать значение области в качестве параметра этой функции. Вот код
HTML-код
<md-datepicker ng-model="dateDebut" md-placeholder="Enter date"> </md-datepicker>
<md-datepicker ng-model="dateFin" md-placeholder="Enter date" ></md-datepicker>
Код контроллера
app.controller('graphCtrl', function($scope, $stateParams, graphDetails, $filter,$http) {
var self = this;
self.dateDebut = $scope.dateDebut;
self.dateFin = $scope.dateFin;
var mettreAJour = graphDetails.mettreAJour(self.dateDebut, self.dateFin);
$scope.labels = mettreAJour.labels;
$scope.data = mettreAJour.data;
});
Код услуги
app.factory('graphDetails', function($filter, $http) {
var labels = [];
var data = [
[]
];
return {
mettreAJour: function(dateDebut, dateFin) {
if (dateDebut && dateFin) {
var dd = $filter('date')(dateDebut, 'yyyy-MM-dd;HH:mm:ss');
var df = $filter('date')(dateFin, 'yyyy-MM-dd;HH:mm:ss');
var dif = dateFin.getDate() - dateDebut.getDate();
//do somthing with labels and data
return {
labels : labels,
data : data
};
}
}
};
});
Поэтому я получаю, что метки ошибок не определены, и если я прокомментирую это, я получаю эту ошибку:
Cannot read property 'getDate' of undefined
что означает, что код не распознает dateFin
или dateDebut
.
Есть ли другой способ передать область обслуживания, или я что-то пропустил в своем текущем коде?
Если я правильно понял вопрос, вам нужно каким-то образом повторно использовать значения, когда dateDebut
свойства dateDebut
или dateFin
.
Чтобы достичь этого, вы можете использовать $watch
или $watchGroup
методы области. Упрощенная демонстрация.
Например
app.controller('graphCtrl', function($scope, graphDetails) {
// start watcher
$scope.$watchGroup(['dateDebut', 'dateFin'], function(args) {
var debut = args[0], fin = args[1];
angular.extend($scope, graphDetails.mettreAJour(debut, fin))
})
})
Скорее всего, это связано с тем, что вы пытаетесь вернуть labels
из mettreAJour
но не знаете labels
и data
.
Надеюсь, что этот ниже фрагмент будет полезен.
app.factory('graphDetails', function($filter, $http) {
var _graphDeatilsObject = {};
_graphDeatilsObject.labels = [];
_graphDeatilsObject.data = [
[]
];
_graphDeatilsObject.mettreAJour = function(dateDebut, dateFin) {
// Rest of the code
}
return _graphDeatilsObject;
});
Также обратите внимание на встроенную аннотацию массива, которая требуется, если вы уменьшаете код
angular.copy
назначить их полям вашего сервиса и изменить эти поля в функции сервиса.mettreAJour
возвращаетundefined
еслиmettreAJour
либо из аргументов не определен. Неудивительно, что следующая строка будет генерировать$scope.labels = mettreAJour.labels;
, Вам нужно проверить, прежде чем пытаться получить доступ к свойству$scope.labels = mettreAJour&&mettreAJour.labels;