目前我正在使用此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">
答案 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);