调用函数来更新一些变量

时间:2016-07-12 10:23:50

标签: javascript angularjs

我有一个集合lines我来自aj​​ax调用,我使用ng-repeat,对于每个项目line,属性line.date需要进行一些修改才能被调度

问题是我不知道如何调用函数进行修改?

我尝试data-ng-initng-init调用该函数,但变量为not updated

Html代码

 <div ng-controller="lineController" data-ng-init="loadLines()">
    <div  ng-repeat="line in lines">
       ...
       <div   data-ng-init="loadDates(line.date)">
         ...
         {{ leftDays}}
       </div>
    </div>
 </div>

Js代码:

var app = angular.module("searchModule", []);

app.controller("lineController", function ($scope, $http)
{
    // LOAD LINES AJAX
    $scope.loadLines = function () {

        $http({method: 'GET', url: '..'}).success(function(data) {

            angular.forEach(data.content, function(item, i) {
                $scope.lines.push(item);
            });

        });

    };

    $scope.loadDates = function (date) {
        // complex updating of date variable    
        ....    
        $scope.leftDays = ...; 
    };

});

2 个答案:

答案 0 :(得分:1)

我认为你不需要这样做。你可以这样做;

$scope.loadLines = function () {
  $http({method: 'GET', url: '..'}).success(function(data) {
    angular.forEach(data.content, function(item, i) {
      $scope.lines.push(item);
    });

    $scope.lines.map(function(line) {
      // here is to modify your lines, with a custom
      line.date = $scope.loadDates(line.date);

      return line;
    })
  });
};

顺便说一句,我认为你可以用这个来修改你的ajax加载函数;

$scope.loadLines = function () {
  $http({method: 'GET', url: '..'}).success(function(data) {
    $scope.lines = data.content.map(function(line) {
      // here is to modify your lines, with a custom
      line.date = $scope.loadDates(line.date);

      return line;
    })
  });
};

如果您不需要在视图中使用loadDates函数,则无需将此函数设置为$scope。您只需var即可设置此功能。然后你可以使用那个功能; loadDates(...)代替$scope.loadDates(...)

如果您不必更新$ scope.lines变量,则不需要使用.map。您可以按如下方式更新该功能;

$scope.loadLines = function () {
  $http({method: 'GET', url: '..'}).success(function(data) {
    $scope.lines = data.content;

    angular.forEach($scope.lines, function(line) {
      // here is to modify your lines, with a custom
      $scope.loadDates(line.date);
    })
  });
};

答案 1 :(得分:1)

为什么不管理angular.forEach中的每个line? 像这样:

$http({method: 'GET', url: '..'}).success(function(data) {

     angular.forEach(data.content, function(item, i) {
          //Do stuff to item here before pushing to $scope.lines
          //item.date = new Date(item.date) blah blah
          $scope.lines.push(item);
     });
});

如果您想在html中以不同的方式显示line.date,并且不想修改实际数据,为什么不为此使用$ filter? 像这样:

<span ng-repeat="line in lines">{{line.date|yourCustomFilter}}</span>