4

我正在寻找一些最佳实践,如何将集合与 REST 同步并使用 Web 套接字获取实时更新。如果我有收藏items...

  • {id: 1, title: "First todo", completed: false}
  • {id: 2, title: "Second todo", completed: true}
  • {id: 3, title: "Third todo", completed: false}

我正在为 TodoItems 定义一个 REST 资源:

app.factory('TodoItems', function($resource) {
    return $resource( '/todoitems/:id', { id: '@id' },
            {create: { method: 'POST' },
            update: { method: 'PUT' } }
});

其余资源应用于fetch整个列表,但update只能用于单个项目。

我可能有某种webSocket.listenForChanges(item.id, cb).

拥有这两种获取、操作数据和获取实时更新的方法,我该如何实际使用它?

...我可以$scope.$watchCollection在任何更改时执行并获取更新,但是每次我手动更改集合时都会运行回调,这不仅是由于用户更新,因为用户更新需要运行TodoItems.update(item),而且 Web 套接字更新不能触发我的 REST API。

webSocket.listenForChanges(item.id, function(newItem) { $scope.item = newItem; });
// This triggers $watchCollection - NOT GOOD, because $watchCollection
// could trigger and call upon REST

AngularFire 以某种方式做到了http://www.youtube.com/watch?v=C7ZI7z7qnHU#t=30m28s但我怀疑他们通过批量同步整个阵列来做到这一点。

$watch对每个项目的控制器中的单个项目进行一些修改,具有以下 JADE 模板

ul
  li(ng-repeat='todo in todos',ng-controller='TodoItemController')

然而问题是一样的,$watch无法区分服务器更新和用户更新。

我唯一的希望是仅从范围控件中调用我的 REST API,updateItem(item) removeItem(item)还是有一些更聪明的方法可以通过 REST/websocket 自动同步集合?

4

1 回答 1

0

您可以使用 ngChange 来监视用户更改。根据文档,它声明 ngChange 将“在用户更改输入时评估给定的表达式。当值更改来自模型时,不会评估表达式。”

我很好奇您为什么要混合使用 REST API 和 WebSocket API。为什么不通过 WebSockets 来做这一切呢?它的重量更轻,而且似乎不混合协议不会那么混乱。

于 2013-12-08T23:15:01.430 回答