1

Я использую модули ngStorage, которые можно найти здесь: https://github.com/gsklee/ngStorage

Я установив lastSeenId в LocalStorage для социального корма живет обновления, так как это гибрид приложение (Laravel/AngularJS) Я не могу сохранить его в $scope.

Мои StatusesController получает массив или данные (или вообще ничего, если никто не для просмотра) когда-либо X секунд, и я получаю последний элемент массива и установить мой $localStorage вар, как это: $localStorage.lastStatusSeen = lastId;

Мой навигационный контроллер, где Я установил несколько новых счетчиков, чтобы пользователь мог убедиться, что они что-то пропустили, я получаю lastSeenId следующим образом: $scope.$storage.lastStatusSeen, который отправляется на мой API, чтобы вернуть несколько невидимых сообщений о статусе.

Это все работает, пользователь находится на странице состояния, если новые данные, а затем установите локальное хранилище var в последний идентификатор в массиве данных.

Проблема в том, что мой NavigationController не находит это изменение и всегда передает lastSeenId, который был передан, когда пользователь впервые посетил страницу.

Есть ли способ посмотреть этот ключ в локальном хранилище для изменений?

EDIT: В соответствии с просьбой, обновленный код

app.controllers.navigationController = ['$scope', 'pollingService', '$localStorage', function($scope, pollingService, $localStorage) { 

    $scope.lastStatusSeen = $localStorage.lastStatusSeen; 

    $scope.$watch(function() { 
     return $localStorage.lastStatusSeen; 
    }, function (newVal, oldVal) { 
     if (!newVal) { 
      return; 
     } 

     if (newVal !== oldVal) { 
      // Assign to a local scoped var, or anything, here... 
      $scope.lastStatusSeen = newVal; 
      // I suggest call a method to do your logic outside this 
      //$scope.onIdChange(newVal, oldVal); // If you need oldVal 
     } 
    }); 

    pollingService.startPolling('emailCount', 'api/email/new-count', 5000, function(response) { 
     $scope.emailCount = response.data; 
    }); 

    pollingService.startPolling('statusCount', 'api/social/new-count?lastid=' + $scope.lastStatusSeen, 5000, function(response) { 
     $scope.socialCount = response.data; 
    }); 

}]; 

ответ

1

Вы можете посмотреть его с помощью $watch метод любого масштаба субъекта angular ($scope или $rootScope):

$scope.$watch(function() { 
    return $localStorage.lastStatusSeen; 
}, function (newVal, oldVal) { 
    if (!newVal) { 
     return; 
    } 

    if (newVal !== oldVal) { 
     // Assign to a local scoped var, or anything, here... 
     // I suggest call a method to do your logic outside this 

     $scope.onIdChange(newVal, oldVal); // If you need oldVal 
    } 
}); 

Будьте осторожны с потому что это выполняется почти каждый цикл $digest. Еще одно замечание, что вы можете связать этот наблюдатель переменной, так что вы можете отменить его в любое время вам нужно:

var watchIdStored = $scope.$watch(function() { 
    /* ... */ 

Если вы хотите, чтобы удалить его, вызовите вар как функцию:

watchIdStored(); // Removes the $watcher 

Редактировать 1:

Проблема есть на pollingService.startPolling('statusCount', 'api/social/new-count?lastid=' + $scope.lastStatusSeen. Он создает строку, которая больше не изменяется. Вы должны сообщать об этом изменении, как это происходит, предоставляя опрос обновления.

Если вы поместите консоль внутри наблюдателя, где вы обновите var, вы увидите, что она обновляется.

Edit 2:

Как есть метод stopPolling(), вы можете создать сборку/уничтожить функцию на контроллере.

function _setupPolling (name, url, pollingTime, callback) { 
    pollingService.stopPolling(name); 

    pollingService.startPolling.apply(pollingService, arguments); 
} 

Теперь вы вызываете его на каждое изменение, которое происходит на $localStorage.lastStatusSeen:

$scope.$watch(function() { 
    return $localStorage.lastStatusSeen; 
}, function (newVal, oldVal) { 
    if (!newVal) { 
     return; 
    } 

    if (newVal !== oldVal) { 
     console.log(newVal); 

     // Assign to a local scoped var, or anything, here... 
     $scope.lastStatusSeen = newVal; 
     // I suggest call a method to do your logic outside this 

     _setupPolling('statusCount', 'api/social/new-count?lastid=' + $scope.lastStatusSeen, 5000, function(response) { 
      $scope.socialCount = response.data; 
     }); 
    } 
}); 
+0

Это не похоже на работу, я делаю как описано выше, код предполагает, я назначаю его в сферу var put мой вызов AJAX по-прежнему показывает ID 23, когда локальное хранилище показывает 24? – ChrisBratherton

+0

Вопрос обновлен, я помещаю это в свой контроллер навигации? – ChrisBratherton

+0

Но если я ставлю вызов pollingService внутри моего наблюдателя, это вызовет только после того, как ID был изменен? Эта функция опроса сервера каждые 5 секунд или около того? – ChrisBratherton

Смежные вопросы