如何获取其值在函数内发生变化的var的值

时间:2014-03-05 17:28:24

标签: javascript jquery angularjs function variables

如何获取值在函数内部发生变化的varible的值,例如我的var total正在改变它在load:function里面的值,但是我想在系列名称中使用结果

 var total = 0;
 $scope.chartMedida = {

    dataSource: { 
        load: function () {
            var def = $.Deferred();
            $http({ method: 'GET', url: ng.api + '/llantas/graficos/'+3}).success(function (data) {
                  def.resolve(data.data);
                  for(var i = 0; i<data.data.length; i++){
                     total = data.data[i].cantidad + total; 
                 }

            });
            return def.promise();
        }
    },
    palette: 'Soft',
    series: {
        argumentField: 'medida',
        valueField: 'cantidad',
        name:total.toString(),
        type: 'bar'

    },
    title: {
        text: 'Existencias por medida',
        fontSize:4

    },
    tooltip: {
        enabled: true
    },
     label: {
        visible: true
    }


};

我在for中获得了总变量的值,但是我无法显示它的值,在这个例子中,我在名称上使用它:total.toString(),请帮助最好答案

4 个答案:

答案 0 :(得分:0)

试试这个

$scope.chartMedida = {

    total:0,

    dataSource: { 
        load: function () {
            var def = $.Deferred();
            $http({ method: 'GET', url: ng.api + '/llantas/graficos/'+3}).success(function (data) {
                  def.resolve(data.data);
                  for(var i = 0; i<data.data.length; i++){
                     $scope.chartMedida.total  += data.data[i].cantidad; 
                 }

            });
            return def.promise();
        }
    },

...

    series: {
        argumentField: 'medida',
        valueField: 'cantidad',
        name:$scope.chartMedida.total.toString(),
        type: 'bar'

    },

答案 1 :(得分:0)

试试这个

series: function() {
    return {
        argumentField: 'medida',
        valueField: 'cantidad',
        name:total,
        type: 'bar'
    }
}

这在测试页面上对我有用,但我不得不使用虚拟数据......

console.log($scope.chartMedida.series());

我认为内部值是在init上设置的,然后不会改变。通过这种方式,它可以在被要求时获得价值。

答案 2 :(得分:0)

这是一个解决方案。创建服务并让服务在返回get数据时设置值。

我已经制作了sample Plunker来演示设置。出于演示目的,我已经删除了处理逻辑,因为我的获取数据只是一个字符串。

var app = angular.module('plunker', []);

app.service('myService', function($http) {
  this.dataSource = function(inObj) {
    $http({
      method: 'GET',
      //url: ng.api + '/llantas/graficos/' + 3
      url: 'myData.html'
    })
      .success(function(data) {
        var total = "";
        //for (var i = 0; i < data.data.length; i++) {
        //  total = data.data[i].cantidad + total;
        //}
        total = data;
        inObj.chartMedida.series.name = total;
      })
      .error(function(data, status) {
        alert("error" + data, status);
      });
    return "...waiting..."
  };
});

app.controller('MainCtrl', function($scope, myService) {
  $scope.chartMedida = {
    palette: 'Soft',
    series: {
      argumentField: 'medida',
      valueField: 'cantidad',
      name: myService.dataSource($scope),
      type: 'bar'
    },
    title: {
      text: 'Existencias por medida',
      fontSize: 4
    },
    tooltip: {
      enabled: true
    },
    label: {
      visible: true
    }
  };
});

答案 3 :(得分:0)

如果您不想创建服务,这是另一个答案。

PLUNKER Answer

这个设置了一个iife内联函数来做同样的事情。它看起来更加混乱。实际上,为chartMedida设置工厂并将其完全从控制器中取出会更加清洁。

app.controller('MainCtrl', function($scope, $http) {
  $scope.chartMedida = {
    palette: 'Soft',
    series: {
      argumentField: 'medida',
      valueField: 'cantidad',
      name: function() {
        $http({
          method: 'GET',
          //url: ng.api + '/llantas/graficos/' + 3
          url: 'myData.html'
        })
          .success(function(data) {
            var total = "";
            //for (var i = 0; i < data.data.length; i++) {
            //  total = data.data[i].cantidad + total;
            //}
            total = data;
            $scope.chartMedida.series.name = total;
          })
          .error(function(data, status) {
            alert("error" + data, status);
          });
        return "...waiting...";
      }(),
      type: 'bar'
    },
    title: {
      text: 'Existencias por medida',
      fontSize: 4
    },
    tooltip: {
      enabled: true
    },
    label: {
      visible: true
    }
  };
});