AngularJS - 在Object中获取值的指令

时间:2015-05-06 13:36:06

标签: javascript html angularjs angularjs-directive

目前我正在使用此for循环来获取父

angular.forEach(queryTicketCategories, function(category) {
    if(category.id === $scope.ticketCategory.parentId) {
        $scope.parent = category;
    }
});

请建议将返回category的通用指令。这里queryTicketCategories是数组的对象。我想为$scope.parent分配一个等于$scope.ticketCategory.parentId

的数组

Html代码

   <input type="text" ng-model="parent" 
   placeholder="{{'PARENT_CATEGORY' | translate}}" 
   typeahead="category as category.name for category in getTicketCategories($viewValue)" 
   typeahead-loading="loading" class="form-control"> 

4 个答案:

答案 0 :(得分:7)

对于您的情况,最好查看typeahead指令并最大限度地使用它。

http://angular-ui.github.io/bootstrap/#/typeahead

您可以将现有指令与回调typeahead-on-select

一起使用,而不是创建自己的指令或服务。
typeahead-on-select($item, $model, $label) (Defaults: null) : 
A callback executed when a match is selected

这是我在不使用回调的情况下创建的示例。它使您可以从键入的内容中选择一个Google地址。

没有typeahead-on-select
http://plnkr.co/edit/GMnzod9MQZWxsKSuJUJu?p=preview

通过将所选地址更改为大写,以下步骤将更进一步。您可以在此回调中执行任何操作。

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

我使用此功能将所选地址更改为大写。

$scope.myFunc = function($item, $model, $label) {
    $scope.asyncSelected = $item.toUpperCase();
}

对于您的情况,您可以像下面这样做

$scope.myFunc = function(category) {
    if(category.id === $scope.ticketCategory.parentId) {
        $scope.parent = category;
    }
}

HTML

typeahead-on-select="myFunc($item)"

总之,您的用例和数据可能与我上面使用的示例不同,但主要方法是相同的。选择项目后会有回调,您可以使用回调typeahead-on-select更多地操纵数据控件。

答案 1 :(得分:6)

如果我理解正确,您希望根据$scope.parent

设置文本框中显示的$scope.ticketCategory.parentId对象

如果是这样,那么指令不是最好的方法。指令适用于影响视图的DOM操作或逻辑。但此功能与更新视图无关。只是视图绑定到$scope.parent,但如果您只是在代码中设置此对象,视图将自动更新(或者可能通过$apply()调用)

在这种情况下,您应该创建一个服务或过滤器以使此操作可重用(同时确保在找到匹配项后返回,因为之后不需要继续循环,对吧?)

但是,如果您坚持使用指令。您可以创建一个依赖于ng-model的指令,并根据其他属性(类别列表,所选的id)设置模型的值。所以用法可能就像这样

<input type="text" ng-model="parent" set-model="ticketCategory.parentId" set-model-list="queryTicketCategories" >

并且指令代码基本上会从queryTicketCategories中找到与ticketCategory.parentId具有相同ID的对象,并使用此对象设置模型。

你可能应该在指令中设置一个标志左右,只运行一次这个代码而不是每个$apply()循环。但是使用服务/过滤器方法,您可以随时设置parent值(可能在服务器请求之后或在回调中),因此我建议您使用该值而不是指令。

答案 2 :(得分:5)

angular.forEach(queryTicketCategories, function(category) {
    if(angular.equals(parseInt(category.id), parseInt($scope.ticketCategory.parentId)) {
        $scope.parent = category;
        return;
    }
});

从您的代码中, queryTicketCategories 必须是一个对象数组。因为你不能循环一个对象。所以尝试使用,

[  { ... }
   , { ... }
   , { ... }
]

此处确保 queryTicketCategories 的格式为

public virtual List<QuoteTransaction> QuoteTransactions{ get; set; }

category.id 才能使用,我们正在使用parseInt,因为可能有 category.id $ scope.ticketCategory.parentId 可能位于字符串中。

请注意,&#39; ===&#39;和angular.equals()具有相同的实现。

答案 3 :(得分:4)

您可以在$ scope.ticketCategory.parentId上观看表达式。一旦$ scope.ticketCategory.parentId的值被更改,然后将$ scope.parent更新为具有相同id的类别。对于搜索,您可以创建过滤器。

示例 -

app.filter('getById', function() {
  return function(queryTicketCategories, id) {
    var i=0, len=queryTicketCategories.length;
    for (; i<len; i++) {
      if (queryTicketCategories[i].id == +id) {
        return queryTicketCategories[i];
      }
    }
    return null;
  }
});

 $scope.$watch('ticketCategory.parentId', function() {
        // do something here
       var found = $filter('getById')(queryTicketCategories, ticketCategory.parentId);
         console.log(found);
         $scope.parent = found;
    }, true);