Хорошо, поэтому я знаю, в чем проблема. Я использую $ watch, и из-за значения, которое я устанавливаю (вызывая функцию в моей службе), каждый раз создается новый массив, и часы постоянно находят новое значение. Мой вопрос, однако, как это исправить. Моя текущая настройка подобна этой (только включая соответствующие части кода):
.controller('ClientCtrl', function($scope, $ionicModal, $ionicPopup, $stateParams, clientService, opportunityService) {
$scope.id = $stateParams.clientId;
$scope.clients = clientService.getClients();
$scope.opportunities = opportunityService.getOpportunities($scope.id);
$scope.$watch(
function(){ return opportunityService.opportunities },
function(newVal) {
$scope.opportunities = newVal;
}
);
.service('opportunityService', function($http) {
this.getOpportunities = function(id) {
this.results = [];
if ( typeof id == 'undefined') {
this.results = this.opportunities;
}
else {
for (var a=0; a<this.opportunities.length; a++) {
if (this.opportunities[a].clientId == id) {
this.results.push(this.opportunities[a]);
}
}
}
return this.results;
};
Неэффективный код в сторону, в основном, что делается здесь, заключается в том, что служба получает объект JSON (не показан), который хранится в this.opportunities. Функция getOpportunities позволяет мне вернуть это контроллеру. По моему мнению, у меня есть список возможностей, где я могу добавлять, редактировать и удалять. Когда я добавляю новую возможность (через popup modal), она не отображается в представлении, пока я не перейду на другую страницу в своем приложении и не вернусь.
По сути, добавление элемента работает, но я бы хотел, чтобы оно появилось без необходимости перемещаться. Я попытался решить эту проблему, добавив $ watch, и, хотя это было эффективное решение, я получил ошибки итерации $ digest. Я бы предпочел избавиться от них сейчас, чтобы они не вызывали никаких будущих проблем.
Есть ли лучший способ обновить мое представление, когда я добавляю элемент без необходимости перемещаться, имея в виду, что объект JSON, хранящий элементы, находится в сервисе, и полагается на передачу параметра ID?
Если я правильно понимаю ваш вопрос, вы должны использовать обещания вместо $ watch.
обслуживание
getOpportunities: function(id) {
// $http.get returns a promise itself.
// With the $q object you can write more complex code if needed
var deferred = $q.defer();
$http.get("/what/ever")
.success(function(data) {
deferred.resolve(data);
})
.error(function() {
deferred.reject("Oops");
});
return deferred.promise;
}
контроллер
var promise = opportunityService.getOpportunities($scope.id);
promise.then(
function(p) {
$scope.opportunities = p.data;
},
function(data) {
alert("error");
});
};