【问题标题】:angularjs: cascade dropdownangularjs:级联下拉菜单
【发布时间】:2013-10-17 02:47:31
【问题描述】:

我正在尝试在 Angular 中实现级联下拉菜单。我认为由于绑定,它会自然而然地工作。见下文:

<select name="client" ng-model="selectedRequest.client" ng-options="c.name for c in clients track by c.id" required></select>
<select id="department" ng-model="selectedRequest.department" ng-options="d.defaultLabel for d in selectedRequest.client.departments track by d.id"></select>

加载视图后,它可以工作,我可以看到与绑定到客户端的部门匹配的部门。但是,每当 selectedRequest.client 更改时,部门下拉列表的源也应该更改,但它会变为空。

编辑

我已将子下拉菜单更改为:

<select id="department" ng-model="selectedRequest.department" ng-options="d.defaultLabel for d in departments track by d.id | filter:{clientId: selectedRequest.client.id}"></select>

但这次它会加载下拉列表中的所有部门,忽略过滤器。

** 编辑 2 **

改为:

 <select name="client" ng-model="requestService.selectedRequest.client" ng-options="c as c.name for c in clients track by c.id" required></select>

 <select id="department" ng-model="requestService.selectedRequest.department" ng-options="d.defaultLabel for d in departments  | filter:{clientId: requestService.selectedRequest.client.id}"></select>

现在选择客户端时源会正确更改。然而,初始选择,即在启动时设置正确的部门,不起作用。那是因为我删除了 'track by id' 位。

【问题讨论】:

  • 这似乎没问题。您需要创建一个小提琴并回购这个问题。也许部门是空的。
  • 我用新方法编辑了我的帖子
  • 如果从 ng-options 中删除“track by”会怎样?
  • 如果我这样做,它会起作用。但随后绑定丢失,即未设置所选值。
  • 作为设计,您可以做的不是在页面加载时自动加载两个数据源,而是在选择城市下拉菜单时发出新请求以获取部门。参考这个jsfiddle来证明$watch的观点

标签: javascript angularjs


【解决方案1】:

正确的方法是

 <select id="department" ng-model="selectedRequest.department" ng-options="d.defaultLabel for d in departments | filter:{clientId: selectedRequest.client.id} track by d.id "></select>

只是我没有将过滤器放在正确的位置......愚蠢的错误。

【讨论】:

  • Track by 被视为过滤器。我只是有同样的问题,这解决了它!谢谢
【解决方案2】:

可能是您的selectedRequest.client clients 数组中引用的对象不同。试试这个:

JS:

function testController($scope) {
            $scope.clients = [
             { id: 1, name: "client1", departments: [{ id: 1, defaultLabel: 'department1' }, { id: 2, defaultLabel: 'department2'}] },
             { id: 2, name: "client2", departments: [{ id: 3, defaultLabel: 'department3' }, { id: 4, defaultLabel: 'department4'}] }
            ];

             $scope.selectedRequest = {};
             $scope.selectedRequest.client = $scope.clients[0];//Assign by object reference.
        }

HTML:

<div ng-controller="testController">
        <select name="client" ng-model="selectedRequest.client" ng-options="c.name for c in clients" required></select>
        <select id="department" ng-model="selectedRequest.department" ng-options="d.defaultLabel for d in selectedRequest.client.departments"></select>
    </div>

DEMO

我删除了track by 以使用默认值(按对象引用跟踪)并确保selectedRequest.client 引用clients 中的对象

【讨论】:

  • 除了删除'track by id'并将源设置为数组中的第一个对象外,我没有看到您所做的更改。我的问题是部门没有被过滤。实际上,我设法通过从 Departments ng-options 中删除“track by id”来使其工作。但是现在,启动时没有设置该值(但选择客户端时源会正确更改)
  • @Sam:您能否在问题中提供更多代码?你是如何初始化你的作用域对象的?
  • @Sam:However now, the value is not set at startup。不知道这是不是你想要的jsfiddle.net/6eCZC/3
  • 这就是我想要的。但它适用于您的原因是因为您将选定的值设置为数组中的第一个对象。在我的例子中,选择的值是一个不是来自源数组的对象。所以它不等于数组中的任何对象-这就是我使用'track by id'的原因
  • @Sam:我不知道您是否可以在初始化范围对象时根据所选值(在您的情况下为 id)find 源数组中的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2013-09-14
  • 2015-11-30
  • 1970-01-01
相关资源
最近更新 更多