4

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

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

但是,我想对初始化值做一些更复杂的处理。即,我想检查foodin是否foodlist已存在于数组中editedFood。如果是,则使用存储的值editedFood作为初始值。如果不是,则使用 0 作为初始值。

所以,我想我需要将此处理移出标记并移至控制器,但我对 Angular 的理解不够好,无法理解在何处以及如何执行此操作。这个 ng-repeat 位于控制器 FoodCtrl 内:

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

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

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: Object # has no method 'forEach'``

我感觉很难过。

4

3 回答 3

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

已编辑

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

$scope.foodlist.forEach(function(food){
    food.slider = 0;
    food.unit.selected = food.unit[0];
});
于 2013-11-05T19:47:22.193 回答
0

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

$scope.foodlist.forEach(function(food) {
    food.slider = 0;
    food.unit.selected = food.unit[0];
});
于 2013-11-05T19:48:33.463 回答
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)">

不知道这是否理想,但它正在工作。

于 2013-11-05T21:11:54.283 回答