当在另一个URL上更新数据时,AngularJS可以在一个URL上触发$ watch

时间:2015-02-19 12:41:36

标签: javascript angularjs

我想知道如果数据库中的更改不是由当前页面上的用户操作引起的,我是否可以触发$watch

例如,控制器

.MesgCtrl(...)
$scope.data = {'name': 'Tim', 'visits': 0};

$scope.$watch('data', function(newValue, oldValue) {
  console.log("$watch triggered");
  });

例如,在 template.html 上我有:

<ul ng-repeat="d in data">
  <li>{{d}}</li>
</ul>

另一个REST端点URL获取访问的POST请求,并在数据库发生时更新它们。我希望访问计数更新 template.html ,以便用户查看数据库中的更新时间。但是,到目前为止,我只能在从同一个AngularJS控制器网址调用$watch来更新访问而不是来自其他网址时才能$resource.save()工作。

2 个答案:

答案 0 :(得分:1)

如果您需要两种方式进行通信,例如当其他人访问某个页面时客户端上的更新,您可以使用像访问每个连接套接字的socket.io http://socket.io/这样的库。)

您还可以添加一个计时器,以便每隔30秒向服务器请求并获取访问计数器的更新(请使用$interval)。

如果您只想在经过一段时间后再申请一次,请使用$timeout

答案 1 :(得分:0)

$interval用于安排数据刷新,并将更改提取到Web浏览器客户端。这是我使用的代码:

conciergeControllers.controller('MessageCtrl',
    function MessageCtrl($scope, $stateParams, $interval, Message, GuestMessages) {
        $scope.messages = {};

        $scope.getGuest = function(GuestMessages, $stateParams, $scope) {
            GuestMessages.get({
                id: $stateParams.guestId
            }, function(response) {
                $scope.guest = response;
                $scope.to = response.phone_number;
                $scope.messages = response.messages;

                // test
                console.log('Guest:', $scope.guest);
            });
        }
        // populate initial context without a delay
        $scope.getGuest(GuestMessages, $stateParams, $scope);

        $interval(function(){ $scope.getGuest(GuestMessages, $stateParams, $scope); }, 5000);
    }
);