1

我正在使用可以在这里找到的 ngStorage 模块:https ://github.com/gsklee/ngStorage

我在 localStorage 中设置 lastSeenId 用于实时更新社交提要,因为这是一个混合应用程序(Laravel/AngularJS),我无法将其存储在$scope.

StatusesController每 X 秒得到一个数组或数据(如果没有查看,则什么都没有),我得到数组的最后一项并$localStorage像这样设置我的 var: $localStorage.lastStatusSeen = lastId;

我的导航控制器是我为用户设置一些新计数器以查看他们是否遗漏了什么的地方,我得到了这样的 lastSeenId: $scope.$storage.lastStatusSeen它被发送到我的 API 以返回许多看不见的状态帖子。

这一切正常,用户在状态页面上,如果有新数据,则将本地存储 var 设置为数据数组中的最后一个 ID。

问题是我NavigationController没有发现这个变化,并且总是传递lastSeenId用户第一次访问页面时传递的那个。

有没有办法在本地存储中查看该密钥的更改?

编辑:根据要求,更新代码

    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;
    });

}];
4

1 回答 1

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 () {
    /* ... */

当你想删除它时,将 var 作为函数调用:

watchIdStored(); // Removes the $watcher

编辑1:

问题出在pollingService.startPolling('statusCount', 'api/social/new-count?lastid=' + $scope.lastStatusSeen. 它构建了一个不再更改的字符串。您必须在此更改发生时通知此更改,向民意调查提供更新。

如果您在观察者中放置一个控制台,在其中更新 var,您会看到它正在更新。

编辑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;
        });
    }
});
于 2015-06-26T20:15:38.410 回答