2017-08-09 55 views
1

我正在创建一个搜索页面,用户可以使用第一个下拉列表中列出的预先选择的搜索条件搜索数据。在下面的例子中,这些标准是'名字','国家'和'国籍'。当第一次下拉式更改时,AngularJS第二次下拉列表不会更新

当用户选择国家或国籍时,第二个下拉菜单显示为选择其中一个国家/国籍。为了填充这个下拉列表,我使用了带有一个变量的ng-options指向控制器中定义的字符串。

但是,如果选择了这两个选项中的一个,并且您想切换到另一个,则第二个下拉列表不会更新。 ngOptions中的值在HTML中得到更新,只是下拉列表中的数据不是。

当您选择“名字”之间没有问题。有谁知道我可以使用什么,以便第二个下拉列表中的值得到更新?

下面是我的代码和工作plunker:http://plnkr.co/edit/LYpOdoLpgiMeHxlGzmub?p=preview

var myApp = angular.module('myApp', []); 
 
myApp.controller("SomeController", function($scope) { 
 
    
 
    var vm = this; 
 
    
 
    vm.search = {id:0, criteria: {}, value: ''}; 
 
    
 
    vm.referenceData = { 
 
     countries: [ 
 
     {COUNTRY_ID:1, COUNTRY_NAME: 'UNITED KINGDOM'}, 
 
     {COUNTRY_ID:2, COUNTRY_NAME: 'AUSTRALIA'}, 
 
     {COUNTRY_ID:3, COUNTRY_NAME: 'SOUTH AFRICA'}, 
 
     {COUNTRY_ID:4, COUNTRY_NAME: 'NETHERLANDS'}, 
 
     ], 
 
     nationalities: [ 
 
     {NATIONALITY_ID: 1, NATIONALITY_NAME: "BRITISH"}, 
 
     {NATIONALITY_ID: 2, NATIONALITY_NAME: "AUSTRALIAN"}, 
 
     {NATIONALITY_ID: 3, NATIONALITY_NAME: "SOUTH AFRICAN"}, 
 
     {NATIONALITY_ID: 4, NATIONALITY_NAME: "DUTCH"}, 
 
     ] 
 
    }; 
 
    
 
    vm.criteriaList = [ 
 
     { name: 'First Name', key: 'FIRST_NAME'}, 
 
     { name: 'Country', key: 'COUNTRY_ID', options:'o.COUNTRY_ID as o.COUNTRY_NAME for o in ctrl.referenceData.countries' }, 
 
     { name: 'Nationality', key: 'NATIONALITY', options:'o.NATIONALITY_ID as o.NATIONALITY_NAME for o in ctrl.referenceData.nationalities' } 
 
    ]; 
 
});
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <script data-require="[email protected]" data-semver="1.6.2" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.js"></script> 
 
    <link rel="stylesheet" href="style.css" /> 
 
    <script src="script.js"></script> 
 
</head> 
 

 
<body ng-app="myApp" ng-controller="SomeController as ctrl"> 
 

 

 
    <p>Criteria:</p> 
 
    <select ng-model="search.criteria" ng-change="search.value = ''" ng-options="criteria as criteria.name for criteria in ctrl.criteriaList"> 
 
    <option value="">- Select Criteria -</option> 
 
    </select> 
 
    
 
    
 
    <p>Value:</p> 
 
    <!-- TEXT INPUT --> 
 
    <input type="text" ng-model="search.value" placeholder="Search Value" ng-if="!search.criteria.options" /> 
 
    <!-- DROPDOWN INPUT --> 
 
    <select ng-model="search.value" ng-if="search.criteria.options" ng-options="{{search.criteria.options}}"></select> 
 

 
</html>

+0

是我第一次看到里面NG选项的表情,我看到plnkr和IM有关方面为什么不刷新。也许是因为ng-options没有处理那些可怕的bindig数据。也许有一个指令可以解决,强制刷新组件。 –

+0

一个非优雅的解决方案是处理两个下拉菜单之一,用于国籍和其他城市。我知道那不是你正在寻找的。 –

+0

这里是一个解决方案,像我说的https://stackoverflow.com/a/27857228/8303694 –

回答

1

这是一个简单的办法,你只需要能够若出第二个下拉每次您切换的变量。因为没有发生scope.$apply,所以dom需要一些东西来强制它刷新。

Plunker Working

试试这个:

var myApp = angular.module('myApp', []); 
myApp.controller("SomeController", function($scope, $timeout) { 

    var vm = this; 
    vm.somVal = false; ///ADD THIS 
    vm.search = {id:0, criteria: {}, value: ''}; 

    vm.triggerSomeVal = function(){ ///ADD THIS 
     vm.someVal = true; 
     $timeout(function(){vm.someVal = false}, 100) 
    }; 

    vm.referenceData = { 
     countries: [ 
     {COUNTRY_ID:1, COUNTRY_NAME: 'UNITED KINGDOM'}, 
     {COUNTRY_ID:2, COUNTRY_NAME: 'AUSTRALIA'}, 
     {COUNTRY_ID:3, COUNTRY_NAME: 'SOUTH AFRICA'}, 
     {COUNTRY_ID:4, COUNTRY_NAME: 'NETHERLANDS'}, 
     ], 
     nationalities: [ 
     {NATIONALITY_ID: 1, NATIONALITY_NAME: "BRITISH"}, 
     {NATIONALITY_ID: 2, NATIONALITY_NAME: "AUSTRALIAN"}, 
     {NATIONALITY_ID: 3, NATIONALITY_NAME: "SOUTH AFRICAN"}, 
     {NATIONALITY_ID: 4, NATIONALITY_NAME: "DUTCH"}, 
     ] 
    }; 

    vm.criteriaList = [ 
     { name: 'First Name', key: 'FIRST_NAME'}, 
     { name: 'Country', key: 'COUNTRY_ID', options:'o.COUNTRY_ID as o.COUNTRY_NAME for o in ctrl.referenceData.countries' }, 
     { name: 'Nationality', key: 'NATIONALITY', options:'o.NATIONALITY_ID as o.NATIONALITY_NAME for o in ctrl.referenceData.nationalities' } 
    ]; 
}); 

<p>Criteria:</p> 
    <select ng-model="search.criteria" ng-change="search.value = ''; ctrl.triggerSomeVal()" ng-options="criteria as criteria.name for criteria in ctrl.criteriaList"> 
    <option value="">- Select Criteria -</option> 
    </select> 


    <p>Value:</p> 
    <!-- TEXT INPUT --> 
    <input type="text" ng-model="search.value" placeholder="Search Value" ng-if="!search.criteria.options" /> 
    <!-- DROPDOWN INPUT ADD !someVal--> 
    <select ng-model="search.value" ng-if="search.criteria.options && !ctrl.someVal" ng-options="{{search.criteria.options}}"></select> 
+0

您是否测试解决方案?我复制代码,它不起作用。 –

+0

坚持我有一个修复对不起,我有一个错误 – Ohjay44

+0

现在应该工作。我忘了将$超时添加到控制器并将Ctrl上下文添加到html。 – Ohjay44

相关问题