【问题标题】:Angular Function Runs on Click but not when Initialized within Controller角函数在单击时运行,但在控制器中初始化时不运行
【发布时间】:2015-07-07 23:28:30
【问题描述】:

使用 Angular,我有一个功能,当连接到视图中的按钮(ng-click)时,可以按预期运行。例如,这会在点击时运行并执行我的函数:

<button ng-click="foo()">add Foo!</button>

但是,我想绕过必须单击此按钮来运行该功能。所以在我的控制器中我添加了:

foo();

这并没有运行我的函数,也没有在视图中使用 ng-init,因此:

<div ng-init="foo()"></div>

我确定我的代码没有被执行,因为它是为写入数据库而设计的。单击时,我在服务器的控制台日志中看到了预期的结果,并且数据被写入数据库。使用上述函数,服务器的控制台日志没有收到响应,也没有新的数据写入数据库。

编辑: 这是我的函数,它向我的服务器发送一个帖子:

$scope.foo = function() {
    var SOName = $scope.bar.SO;
    var len = $scope.bar.FP.length;
    for(x=0;x<len;x++){
        $http.post('/track', {"track":$scope.bar.FP[x].name, "project":$scope.bar.SO}).success(function(response) {
    console.log(response);
  });
};};

在哪里

$scope.bar =
{"SO":"Do xx","QT":0,"RG":[{"name":"yy","LOE":0,"QT":0}],"FP":[{"name":"zz","LOE":3,"QT":0},{"name":"bb","LOE":1,"QT":0},{"name":"ff","LOE":1,"QT":0}],"VP":[],"QC":[{"name":"ww","LOE":15,"QT":0}],"ED":[{"name":"ee","LOE":0,"QT":0}]}

在尝试手动运行该函数时,我将$scope.foo更改为var foo并添加了foo();以尝试运行该函数。

编辑: 尝试在视图中简单地调用{{foo()}} - 虽然这非常挑剔。该页面要么在加载时挂起,要么在同一件事的帖子后反复发送帖子。

【问题讨论】:

  • 让我们看看函数。您知道它没有运行的理由并不完全是万无一失的。如果函数中的变量之一未在全局范围内定义等,它可以运行函数但永远不会访问您的服务器/数据库
  • 在您的控制器中,您在$scope 上定义了一个函数foo?那么你也需要这样称呼它$scope.foo()
  • @BettySt 好点。忘了提到从控制器运行该命令时我确实将其更改为var foo。当我在电脑前时会更新我的帖子。
  • @PatrickMurphy - 刚刚将该功能添加到我的原始帖子中。
  • 你的函数中变量x在哪里定义?尝试将 foo() 的第一行设置为 console.log('entered foo function');,以查看在尝试调用它时是否可以确保该函数没有运行

标签: javascript angularjs node.js


【解决方案1】:

这是一个关于如何在页面/控制器加载时执行函数 foo() 的工作 Plunk:

http://plnkr.co/edit/acmJXYpzFZx39GYoOGIW?p=preview

深入了解IndexCtrl.js,其中包含将foo() 作为$scope 的一部分、作为控制器本地function() 以及使用ng-init 内联标记的示例。

希望有帮助!

【讨论】:

    【解决方案2】:

    这是一些从控制器中运行函数的代码

    angular
      .module('myApp', [])
      .controller('ctrl', function() {
        var vm = this;
        vm.check = false;
    
        vm.f = function() {
          vm.check = true;
        }
    
        vm.f();
      });
    
    <div ng-app="myApp">
      <div ng-controller="ctrl as c">
        {{c.check}}
      </div>
    </div>
    

    【讨论】:

      【解决方案3】:

      尝试重新编写foo() 函数以在for 循环中包含以下http 帖子:

          var postdata = {"track":$scope.bar.FP[x].name, "project":$scope.bar.SO},
                  req = {
                          method: 'POST',
                          url: '/track',
                          headers: {
                              'Content-Type': "application/x-www-form-urlencoded; charset=utf-8"
                          },
                          data: $.param(postdata)
                      };
      
          $http(req).success(function(data, status, headers, config){
              console.log(data); 
          }).error(function(data, status, headers, config){
                  alert("error"+res);
          });
      

      我只是确保您拥有正确的Content-Type 标头,并使用$.param() 函数准备数据。此外,我还为 http 请求添加了一个错误处理程序,它可以让您看到帖子失败的原因。

      【讨论】:

      • 感谢您撰写本文。我无法直接复制并粘贴到 for 循环中,但这可能是由于我的 node.js 服务器如何处理帖子。它使用requestify 来运行帖子。我可以集成代码,但似乎我正在尝试做的事情应该很简单地通过角度来实现。
      【解决方案4】:

      为了解决这个问题,我简单地添加了一个 setTimeout:

      setTimeout(function() { $scope.foo() },4000);
      

      四秒钟给了依赖函数足够的时间来加载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-18
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 2019-04-28
        • 2015-01-18
        • 1970-01-01
        相关资源
        最近更新 更多