У меня есть следующие услуги в мое приложение:
uaInProgressApp.factory('uaProgressService',
function(uaApiInterface, $timeout, $rootScope){
var factory = {};
factory.taskResource = uaApiInterface.taskResource()
factory.taskList = [];
factory.cron = undefined;
factory.updateTaskList = function() {
factory.taskResource.query(function(data){
factory.taskList = data;
$rootScope.$digest
console.log(factory.taskList);
});
factory.cron = $timeout(factory.updateTaskList, 5000);
}
factory.startCron = function () {
factory.cron = $timeout(factory.updateTaskList, 5000);
}
factory.stopCron = function (){
$timeout.cancel(factory.cron);
}
return factory;
});
Затем я использую его в такой контроллер:
uaInProgressApp.controller('ua.InProgressController',
function ($scope, $rootScope, $routeParams, uaContext, uaProgressService) {
uaContext.getSession().then(function(){
uaContext.appName.set('Testing house');
uaContext.subAppName.set('In progress');
uaProgressService.startCron();
$scope.taskList = uaProgressService.taskList;
});
}
);
Поэтому в основном фабрика моего обновления.задач каждые 5 секунд и я связал это фабрика.задач
в $охвата.задач
. Потом я пробовал различные методы, такие как $применить
, $Digest
более но изменения на заводе.список задач не отражается в мой контроллер и вид $охвата.задач
.
Он остается пустым в моем шаблоне. Вы знаете, как я могу распространить эти изменения ?
При использовании `$часы могут решить эту проблему, это не самое эффективное решение. Возможно, вы захотите изменить способ хранения данных в службе.
Проблема в том, что вы не замена памяти, что ваш задач
связанный с каждый раз, когда вы присвоить новое значение, а область застряла указывая на старое место. Вы можете увидеть, как это происходит в этот бухнуть.
Возьмите снимки кучи с Chrome при первой загрузке бухнуть и, после нажатия кнопки, вы увидите, что ячейки памяти объем указывает на никогда не обновляется, а список точек в другое место памяти.
Вы можете легко исправить эту проблему с помощью вашего сервиса удерживайте объект, который содержит переменные, которые могут меняться (что-то вроде данных:{задача:[], х:[], з:[]}
). В этом случае на "Сведения" и никогда не должны быть изменены, но любой из его членов может быть изменена при необходимости. Вы затем передать эти данные переменного объема и, как долго, как вы Дон'т заменить его, пытаясь присвоить себе "Сведения" на что-то другое, когда поле внутри данных изменений объем будет об этом знать и правильно обновить.
Этот бухнуть показывает тот же пример работает с помощью исправления, предложенные выше. Не нужно использовать какие-либо наблюдатели в этой ситуации и если случится так, что что-то не обновляется на вид вы знаете, что все, что вам нужно сделать, это запустить сфера `$применить, чтобы обновить представление.
Таким образом, вы исключите необходимость для наблюдателей, что часто сравниваем переменные для изменения и некрасивой установки, участвующих в тех случаях, когда вам нужно смотреть много факторов. Единственная проблема с этим подходом заключается в том, что на ваши представления (HTML), вы будете иметь "и данных.&я предварив все, где вы раньше просто имя переменной.
Угловые (В отличие от Эмбер и некоторые другие механизмы), не предусматривает специальных объектов wrapped, который semi-magically оставаться в синхронизации. Объекты, которые вы манипулируете обычные объекты JavaScript и просто нравится говорить ВАР а = b;
не link переменные a
и B
, говорю, `$объем.задач = uaProgressService.задач не связать эти два значения.
Для такого рода ссылка
-Инг угловые
предоставляет $смотреть
на $охват
. Вы можете смотреть значение uaProgressService.список задач и измените значение на $охват
, когда он меняет:
$scope.$watch(function () { return uaProgressService.taskList }, function (newVal, oldVal) {
if (typeof newVal !== 'undefined') {
$scope.taskList = uaProgressService.taskList;
}
});
Первое выражение перешло к $часы функция выполняется на каждом [
$дайджест`] (http://docs.angularjs.org/guide/concepts) и второй аргумент-это функция, которая вызывается с новым и старым значением.
Я'м не уверен, если это помогает, Но то, что я делаю-это привязать функцию к $область.значение. Например
angular
.module("testApp", [])
.service("myDataService", function(){
this.dataContainer = {
valA : "car",
valB : "bike"
}
})
.controller("testCtrl", [
"$scope",
"myDataService",
function($scope, myDataService){
$scope.data = function(){
return myDataService.dataContainer;
};
}]);
Тогда я просто свяжу на дом как
<li ng-repeat="(key,value) in data() "></li>
Таким образом, вы можете избежать использования $смотреть в коде.
Нет $смотреть
и т. д. требуется. Вы можете просто определить следующие
uaInProgressApp.controller('ua.InProgressController',
function ($scope, $rootScope, $routeParams, uaContext, uaProgressService) {
uaContext.getSession().then(function(){
uaContext.appName.set('Testing house');
uaContext.subAppName.set('In progress');
uaProgressService.startCron();
});
$scope.getTaskList = function() {
return uaProgressService.taskList;
};
});
Поскольку функция getTaskList
принадлежит $охват
возвращаемое значение будет оцениваться (и обновляется) на каждое изменение uaProgressService.задач`
Легкая альтернатива заключается в том, что во время инициализации контроллера вы подписаться на картину уведомитель в службе.
Что-то вроде:
app.controller('YourCtrl'['yourSvc', function(yourSvc){
yourSvc.awaitUpdate('YourCtrl',function(){
$scope.someValue = yourSvc.someValue;
});
}]);
А что-то вроде:
app.service('yourSvc', ['$http',function($http){
var self = this;
self.notificationSubscribers={};
self.awaitUpdate=function(key,callback){
self.notificationSubscribers[key]=callback;
};
self.notifySubscribers=function(){
angular.forEach(self.notificationSubscribers,
function(callback,key){
callback();
});
};
$http.get('someUrl').then(
function(response){
self.importantData=response.data;
self.notifySubscribers();
}
);
}]);
Это может позволить вам настроить более тщательно, когда контроллеры обновления от сервиса.
Как Габриэль Piacenti сказал, Не часы нужны, если вы оберните изменение данных в объект.
но для обновления измененных данных услуг в рамках правильно, важно, что стоимость объем контроллер, который использует данные услуги не указывает напрямую на изменение данных (поле). Вместо значения объема должны указывать на объект, который описывает изменение данных.
Следующий код должен объяснить это более ясно. В моем примере я использую НЛС сервис для перевода. В НЛС жетоны получают обновление через HTTP.
Служба:
app.factory('nlsService', ['$http', function($http) {
var data = {
get: {
ressources : "gdc.ressources",
maintenance : "gdc.mm.maintenance",
prewarning : "gdc.mobMaint.prewarning",
}
};
// ... asynchron change the data.get = ajaxResult.data...
return data;
}]);
Контроллер и выражения область
app.controller('MenuCtrl', function($scope, nlsService)
{
$scope.NLS = nlsService;
}
);
<div ng-controller="MenuCtrl">
<span class="navPanelLiItemText">{{NLS.get.maintenance}}</span>
</div>
Приведенный выше код работает, но сначала я хотел получить доступ к моей НЛС маркеров (см. следующий фрагмент кода), а вот значения не устарела.
app.controller('MenuCtrl', function($scope, nlsService)
{
$scope.NLS = nlsService.get;
}
);
<div ng-controller="MenuCtrl">
<span class="navPanelLiItemText">{{NLS.maintenance}}</span>
</div>