【问题标题】:Update default select option when filtering select list过滤选择列表时更新默认选择选项
【发布时间】:2013-08-29 02:25:59
【问题描述】:

我一直在尝试根据单选按钮选择过滤显示在下拉列表中的选项列表。

<div>
    <div ng-controller="sampleCtrl">
        <label>
            <input type="radio" name="type" ng-value="1" ng-model="selectedType" />A</label>
        <label>
            <input type="radio" name="type" ng-value="2" ng-model="selectedType" />B</label>
        <select ng-model="selectedOption" ng-options="option.id as option.name for option in options | filter:{type:selectedType}">
            <option value="">&lt;Select&gt;</option>
        </select>
        <hr/>
        <div>Type: {{selectedType}}</div>
        <div>Option: {{selectedOption}}</div>
    </div>
</div>

function sampleCtrl($scope) {

    $scope.selectedType = 1;

    $scope.selectedOption = 0;

    $scope.options = [{
        id: 1,
        name: 'bread',
        type: 1
    }, {
        id: 2,
        name: 'sugar',
        type: 2
    }, {
        id: 3,
        name: 'tea',
        type: 1
    }, {
        id: 4,
        name: 'coffee',
        type: 2
    }, {
        id: 5,
        name: 'butter',
        type: 2
    }];
}

这里是jsFiddle

我有一个默认的 '' 选项,每次用户更改类型时都会显示该选项。 现在它会根据类型过滤我的选项。但是,当过滤器更改为时,它不会改变我的模型。

请帮忙。

谢谢。

【问题讨论】:

  • 我无法理解您的问题 - 您的意思是指出当从选项 B 更改为 A 时,选择模型未重置并仍保留先前选择的行为?
  • 是的。这就是我的意思。对不起,如果我的问题不够清楚。

标签: javascript angularjs option


【解决方案1】:

我想这就是你需要的:Fiddle

基本上,当用户通过在单选按钮之间切换来更改类型时,watch 将被触发,这将重置所选选项。

因此,在更改类型时,它确保与所选选项关联的模型被重置。

$scope.$watch('selectedType', function (newValue, oldValue) {
    if (newValue !== oldValue) {
        $scope.selectedOption = null;
    }
});

【讨论】:

  • 是的,这就是我想要的。谢谢@callmekatootie!
【解决方案2】:

简化@callmekatootie 的回答:

在这种情况下,您不需要参数 newValueoldValue

$scope.$watch('selectedType', function() {
    $scope.selectedOption = 0;
});

我还从$scope.selectedOption = null 更改回初始值,因为$watch 在onload 期间被触发。这可以防止以后出现其他问题。

Fiddle

【讨论】:

  • 如果我不检查 newValue 和 oldValue,它总是会改变它。不是我想要的东西。不过感谢您的建议。
  • @vaibinewbee 你的意思是,如果你在 A 型上并单击 A 型,它会将其更改为默认值?如果这就是您所指的,那么这不是真的,因为单选按钮的值仅在选择另一个单选按钮时才会改变。我不确定我是否理解。我的 JsFiddle 与 callmekatootie 的工作方式相同,并提供了值和代码。除非我错过了什么。
  • 这是一个非常独立的例子。纵观全局,例如,当您从现有数据模型修改数据,并根据对象的现有属性在下拉列表中设置您选择的值时。在这种情况下,当视图第一次加载时,它将始终将其设置为 null。这是我正在尝试做的事情。所以它对我不起作用。正如我所说,我喜欢你的建议。
  • 明白,是的,您是对的,在大多数情况下,您需要查看新旧值,以便了解和使用好。我为您提供的代码提供了一个简化的示例。只是要明确一点,我并不是在游说一个可接受的答案,只是给出一个选项,这就是为什么我认为 callmekatootie 并呼吁“在这种情况下”。不管怎样,很高兴你能解决它,祝你好运。 :)