如何将这些ng-init移动到控制器中?

时间:2013-11-05 19:40:27

标签: javascript angularjs

我正在使用ng-repeat打印出许多食物项目输入。我目前正在使用ng-init来初始化输入的值,如下所示:

 <div class="formitem" ng-repeat="food in foodlist" ng-init="food.slider=0; food.unit.selected = food.unit[0];">

但是,我想对初始值进行更复杂的处理。也就是说,我想检查food中的foodlist是否已存在于数组editedFood中。如果是,则使用editedFood中存储的值作为初始值。如果不是,请使用0作为初始值。

所以,我想我需要将这个处理从标记移到控制器上,但我不太了解Angular,以便了解哪里和哪个?这该怎么做。这个ng-repeat位于控制器FoodCtrl中:

myApp.controller('FoodCtrl', function ($scope, $http, $location, $anchorScroll, $filter) { }

我应该在FoodCtrl中进行初始化处理吗?如何为FoodCtrl中的每个food.slider初始化food.unit.selectedfood in foodlist的值?

The Plunkr


更新

我现在尝试将此变体添加到FoodCtrl中,无论是在控制器的顶层还是函数中,都没有运气:

 $scope.foodlist.food.slider = 0;

错误:TypeError: Cannot set property 'slider' of undefined

 $scope.food.slider = 0;

错误:TypeError: Cannot set property 'slider' of undefined

if ($scope.foodlist.food.slider !== undefined) {
  console.log("slider")
  $scope.foodlist.food.slider = 0;
}

错误:TypeError: Cannot set property 'slider' of undefined

$scope.foodlist.forEach(function(food) {
    food.slider = 0;
    food.unit.selected = food.unit[0];
  });

错误:`TypeError:对象#没有方法'forEach'``

我感到非常难过。

3 个答案:

答案 0 :(得分:0)

ng-init指令将添加当前范围之外的属性。

所以你正在做的就是这个(在控制器内部):

//ng-init="food.slider=0; food.unit.selected = food.unit[0];
$scope.food.slider = 0;
$scope.food.unit.selected = food.unit[0];

请注意,每次初始化控制器时都会设置一次。

如果定义了事物或者它们应该具有默认设置,您可能需要更复杂的逻辑来处理。

http://docs.angularjs.org/api/ng.directive:ngInit

<强> EDITTED

误解了你试图做的事情......这是正确的方法。

$scope.foodlist.forEach(function(food){
    food.slider = 0;
    food.unit.selected = food.unit[0];
});

答案 1 :(得分:0)

在您的控制器中添加类似的内容。

$scope.foodlist.forEach(function(food) {
    food.slider = 0;
    food.unit.selected = food.unit[0];
});

答案 2 :(得分:0)

我通过向控制器添加一个函数foodInit(food)来完成它:

$scope.foodInit = function(food) {
 food.slider = 0;
 food.unit.selected = food.unit[0];
 console.log(food)
}

用ng-init调用它:

<div class="formitem" ng-repeat="food in foodlist" ng-init="foodInit(food)">

不知道这是否理想,但它正在发挥作用。