【问题标题】:Using AngularJS $scope within OpenCPU在 OpenCPU 中使用 AngularJS $scope
【发布时间】:2015-10-06 19:14:43
【问题描述】:

我对 angularjs 有一定的了解,但我更像是一名 R 程序员,因此我一直在尝试使用 OpenCPU js 库。

我无法理解的一件事是,为什么我不能将简单 API 请求的输出分配给公共 OpenCPU 服务器 rnorm(n = 2) 函数,分配给角度 $scope。让我困惑的是,我可以使用 jquery 例如通过 ID 分配返回的 json。

据我了解,最好不要将 jquery 混入角度控制器。我这样想对吗?

使用 Jquery

app.controller('rCtrl', function($scope){

  req = ocpu.rpc('rnorm',{
    n : 2
  }, function(output){$('#output').text(output)});
})

不工作 $scope

app.controller('rCtrl', function($scope){

  req = ocpu.rpc('rnorm',{
    n : 2
  }, function(output){$scope.normalValues = output)});
})

【问题讨论】:

    标签: javascript angularjs opencpu


    【解决方案1】:

    由于您使用的是非 Angular 工具,因此您在 Angular 摘要循环之外分配了 $scope.normalValues。使用 $scope.apply() 来解决这个问题:

    app.controller('rCtrl', function($scope){
    
      req = ocpu.rpc('rnorm',{
        n : 2
      }, function(output){
         $scope.$apply(function(){
             $scope.normalValues = output;
         });
      )});
    });
    

    您也可以在设置范围值后立即调用 $scope.$apply(),但我个人喜欢回调语法,因为它可以更容易地了解您使用它的原因。

    【讨论】:

    • 谢谢@Bas。正是我想要的。
    • 我的荣幸。请不要忘记投票并标记为答案;)
    【解决方案2】:

    我猜这是因为你的函数永远不会触发 $digest 循环 - 所以你必须用 $timeout 强制一个

    app.controller('rCtrl', function($scope, $timeout){
        req = ocpu.rpc('rnorm',{
            n : 2
        }, function(output){
            $timeout(function() { $scope.normalValues = output })
        })  
    })
    

    【讨论】:

    • $timeout 不适合在这里使用。它有效,但实际上是 $timeout 中的 $scope.apply 使它发生,因此您可以(并且应该)改用它。它也更具描述性。
    • @BasSlagter -- $apply() 实际上不是你想要的——如果你尝试在摘要中使用它可能会导致问题——$timeout 是这样做的安全方法。
    • 你指的是什么问题?除非您的代码中的其他内容非常错误(如果您使用这样的超时,可能会发生这种情况;))
    • @BasSlagter -- 如果$digest 循环已经在其他地方进行,$apply 将抛出错误。
    • 如果摘要已经在进行中,则此代码应该可以在没有任何应用或超时的情况下运行;) 如果 $apply 给您一个错误。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多