我正在寻找一些最佳实践,如何使用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
无法区分服务器更新和用户更新。
我唯一希望只从updateItem(item)
removeItem(item)
这样的范围控件调用我的REST API,还是有更聪明的方法可以通过REST / websocket自动同步集合?
答案 0 :(得分:0)
您可以使用ngChange来监视用户更改。根据文档,它声明ngChange将“在用户更改输入时评估给定表达式。当值更改来自模型时,不会计算表达式。”
我很好奇为什么要混合使用REST API和WebSocket API。为什么不通过WebSockets完成所有操作?它重量更轻,似乎不会混淆协议。