角度函数在单击时运行,但在Controller中初始化时不运行

时间:2015-06-30 21:00:53

标签: javascript angularjs node.js

使用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()}} - 但这非常挑剔。该页面会挂起,或者在发布相同内容后重复发送帖子。

4 个答案:

答案 0 :(得分:0)

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

  

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

在插件IndexCtrl.js中,它包含将foo()作为$scope的一部分调用,作为控制器本地function()并使用ng-init的示例}内联标记。

希望有所帮助!

答案 1 :(得分:0)

以下是一些在控制器中运行函数的代码

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>

答案 2 :(得分:0)

尝试重新编写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请求添加了一个on错误处理程序,它允许您查看帖子失败的原因。

答案 3 :(得分:0)

为了解决这个问题,我只需添加一个setTimeout:

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

四秒钟为相关功能提供足够的时间来加载。