【问题标题】:Using PrivatePub with Angular JS将 PrivatePub 与 Angular JS 一起使用
【发布时间】:2014-09-13 12:16:31
【问题描述】:

我正在尝试在我的 Angular 应用程序中使用 PrivatePub。我有一个聊天,消息由 AngularJS 管理,我背后的 API 使用 Rails 运行,在我的控制器中,我使用助手发布到频道,我的问题出在客户端的订阅。这是我尝试做的:

chat.controller("MessageController", ['$scope','Message','Project', function($scope,Message,Project) {
    //Fetch messages
    Message.query(function(data) {
        $scope.messages = data;
    });

    PrivatePub.subscribe(Project.channel, function(data, channel) {
        $scope.messages.push(data.message);
    });
}]);

我尝试在我的 PrivatePub 订阅中使用 $apply 和 $watch,但无法更新我的范围。我的 PrivatePub 函数应该在 Angular 之外,但它收到的数据应该添加到 $scope。我不知道我可以尝试什么其他解决方案。

【问题讨论】:

  • it didn't work 没有太多解释。您是如何尝试使用$apply 的?发生了什么?抛出错误?
  • 首先我得到了Error: $digest already in progress,我找到了一些答案,例如if(!$scope.$$phase) { //$apply },显然不推荐,当我使用它时,我的代码根本没有执行。当我使用 $watch 我的代码被执行但范围没有更新。
  • 尝试使用$timeout,将等待摘要完成
  • 我刚刚尝试使用 $timeout,例如 here 范围没有立即更新,我会立即在控制台中收到数据,但在我触发 UI 上的某些事件之前,视图不会更新。就像 Angular 不知道范围获得了一个新值。

标签: ruby-on-rails angularjs publish-subscribe private-pub


【解决方案1】:

好的,我发现了问题,我没有正确使用$apply,我基本上是这样做的:

$timeout(function () {
  $scope.$apply(function($scope) {
    PrivatePub.subscribe("/mychannel", function(data, channel) {
      $scope.addMessage(data.chat_message);
    });
  });
}, 0);

代替:

$timeout(function () {
   PrivatePub.subscribe("/mychannel", function(data, channel) {
     $scope.$apply(function($scope) {
       $scope.addMessage(data.chat_message);
     });
   });
}, 0);

我想通知 Angular 的变化不是函数本身,而是内部发生的事情。只是一个不好的用途。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多