限制AngularJS聊天室中消息的最佳方法是啥
Posted
技术标签:
【中文标题】限制AngularJS聊天室中消息的最佳方法是啥【英文标题】:What's the best way to limit the messages in an AngularJS Chatroom限制AngularJS聊天室中消息的最佳方法是什么 【发布时间】:2014-05-14 12:29:01 【问题描述】:好的,设置如下:
构建一个实时 AngularJS 聊天应用程序。但是,我想限制用户通过 API 调用看到的消息,该 API 调用确定他们附近的其他消息。
出于某种原因,我无法理解这一点。我探索了 socket.io、FireBase、PubNub,但我似乎无法想出一个好的方法来限制基于设置参数的 API 调用从这些服务返回的数据。
想法?
【问题讨论】:
见***.com/questions/19578303/…和amscotti.github.io/firebasemapexample/#。 【参考方案1】:Proximity 的 Geohashing 聊天
立即尝试:Geohash Chat by Proximity
要按位置连接两个或更多人的组,您将采用纬度/经度值并降低精度分辨率,通过这样做您可以扩大邻近度的覆盖范围。您可以一次使用多个分辨率或固定分辨率。
获取源代码:GitHub Repository for Geo Chat by Proximity
地理散列的基础知识
接下来我们将介绍一些用于地理散列纬度/经度坐标的源代码 sn-p。通过降低浮点值的准确性来增加纬度/经度位置的半径是相当简单的。使用它,您可以扩大圆圈并收集纬度/经度。
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Geo Hash
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
function geohash( coord, resolution )
var rez = Math.pow( 10, resolution || 0 );
return Math.floor(coord * rez) / rez;
地理散列分辨率“缩放”
“缩放”级别,基本上是几个不同的笛卡尔网格,粒度越来越大。一旦地理围栏事件触发,您将发布到与每个缩放级别对应的一组通道。缩放级别很重要,因为这是我们实际构建地理围栏和 PubNub 之间链接的方式。缩放级别是笛卡尔坐标 Lat/Long 的分辨率/去分辨率(想想 X,Y 坐标)。通过降低纬度/经度坐标的分辨率,我们可以构造一个匹配网格 1 个框的通道名称。分辨率越低意味着框越大,并且需要确定关联的 PubNub 频道。
// Create Proximity Channel
channel = geohash( pos.latitude, 0 ) + '' + geohash( pos.longitude, 0 );
这将创建一个非常宽的圆圈并生成一个用于连接的频道名称。接下来使用此频道名称连接到 PubNub。
// Connect to Proximity Channel
pubnub.subscribe(
channel : channel,
message : receive,
connect : ready,
presence : presence
);
复用 9 个盒子
您将计算周围的正方形,以提供更精确的方式扩展锥度和半径。这将消除“围栏”效果。
使用 PubNub 进行地理散列结论
就是这样!您只需降低地理坐标的分辨率并将其用作 PubNub 上的频道名称。另请查看浏览器的 navigator.geolocation.getCurrentPosition(...)
方法以在 chrome/firefox/ie/opera/mobile/safari 浏览器中获取 lat/long。
还可以查看PubNub Connected Car Solution Kit
【讨论】:
这是一个聪明的解决方案并且效果很好,但是它将盒子视为栅栏,而不是用户。因此,用户只会连接到他们盒子内的人,而不是将用户视为他们看到的消息的半径。因此,例如,如果用户 A 在 Box 1 的最左边缘,而用户 B 在相邻 Box 2 的最右边缘,即使他们彼此相邻,他们也不会在同一个聊天室。我理解正确吗? "Next-to" 是相对的。放大另一个级别,“next-to”变成“!next-to”。也许您可以将当前用户的级别/框分解为下一个级别的 9 个子框。 1)如果用户在中心框,只需使用当前框。 2)如果用户在“右中心”子框内,则包括右相邻的完整框。 3) 如果用户在“右上角”子框中,则包括上方、右上方和右上方的相邻完整框。这会有帮助吗? 您可以使用PubNub Multiplexing并连接到所有周围的8个盒子。 多路复用 9 个盒子 -- 您将计算周围的正方形,以提供更准确的方式扩展锥度和半径。这将消除“围栏”效果。以上是关于限制AngularJS聊天室中消息的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
在这种情况下,在 AngularJS 中处理事件的最佳方法是啥?
使用 angularjs 播放 rtmp 流的最佳方法是啥?