当前位置: 首页 > 面试题库 >

Angular.js:更新ng-model时选择不更新

许胡非
2023-03-14
问题内容

我创建了以下示例,以便您可以确切了解正在发生的事情:http :
//jsfiddle.net/8t2Ln/101/

如果我使用ng-options,也会发生同样的事情。我这样做有不同的原因,但由于简化了示例,所以省略了这一部分。

如您所见,默认情况下它具有两个选项。我将在选择旁边显示ng-
model的选择值,以便您可以看到它的含义。当您在顶部添加第三个选项时,它会将值设置为该新选项的值,这可以通过选择旁边显示的ng-
model值来证明,但是选择本身不会更改以显示正确的值已选择。

以下是链接中的示例代码:

var testApp = angular.module('testApp', ['ngRoute']);

testApp.controller('Ctrl', function ($scope) {

    $scope.newInput = '';
    $scope.inputDevice = [
        {
            value: '1',
            label: 'input1'
        },
        {
            value: '2',
            label: 'input2'
        }
    ];
    $scope.selectedDevice = '';

    $scope.addType = function () {
        var newElem = {
            label: $scope.newInput,
            value: '3'
        };
        $scope.inputDevice.push(newElem);
        $scope.selectedDevice = newElem.value;
    };


});

这是html:

<div ng-app="testApp">
    <div ng-controller="Ctrl">
        <p>
            <input type="text" ng-model="newInput" />
            <br />
            <button ng-click="addType()">Add Type</button>
        </p>
        <select ng-model="selectedDevice">
            <option></option>
            <option ng-repeat="i in inputDevice" value="{{ i.value }}">{{ i.label }} - {{ i.value }}</option>
        </select>
        {{ selectedDevice }}</div>
</div>

问题答案:

这就是为什么您不应该使用ngRepeat渲染选择选项的原因。您应该ngOptions改用:

<select ng-model="selectedDevice" 
        ng-options="i.value as (i.label + '-' + i.value) for i in inputDevice">
    <option></option>
</select>

通常,避免使用ngRepeat呈现选择选项。至少有两个很好的理由。ngRepeat每次html" target="_blank">迭代创建单独的子作用域,如果使用option标签,则不需要此作用域。另一个重要的警告是,ngRepeat您只能将select绑定到诸如字符串之类的基元,但是您将无法使用它将对象写入ngModel。

这是下面的演示。

angular.module('demo', []).controller('DemoController', function($scope) {



    $scope.newInput = '';

    $scope.inputDevice = [

        {value: '1', label: 'input1'},

        {value: '2', label: 'input2'}

    ];



    $scope.selectedDevice = '';

    $scope.addType = function() {

        var newElem = {

            label: $scope.newInput,

            value: Number($scope.inputDevice[$scope.inputDevice.length - 1].value) + 1

        };

        $scope.inputDevice.push(newElem);

        $scope.selectedDevice = newElem.value;

        $scope.newInput = '';

    };



});


<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular.min.js"></script>

<div ng-app="demo" ng-controller="DemoController">

    <form ng-submit="addType()">

        <input type="text" ng-model="newInput" />

        <button type="submit">Add Type</button>

    </form>

    <select ng-model="selectedDevice" ng-options="i.value as (i.label + ' - ' + i.value) for i in inputDevice">

        <option>Select</option>

    </select>

    {{ selectedDevice }}

</div>


 类似资料:
  • 问题内容: 这里的PLUNKR示例 我正在使用某种形式的jquery autocomplete作为angularjs direcitve。当jquery使用angular 更新输入的值时,直到下一个摘要(我想)之后才注意到更改。 我的第一个想法是使用来对后摘要执行操作,但是如您所见,它没有帮助。 我的第二种方法是重写该元素的功能以触发事件,但是我没有设法使其起作用。 尝试从自动完成列表中选择一个值

  • 问题内容: 这是我的HTML: 当我在框中输入内容时,该模型会通过2向绑定机制进行更新。甜。 但是, 当我通过JQuery执行此操作时… 它不会更新模型。为什么? 问题答案: Angular不知道这种变化。为此,您应该在以下位置致电或进行更改: 看到这个以更好地了解 脏检查 更新 :这是一个示例

  • 问题内容: 码: 当我在中输入内容时,以下内容将立即更改。是否可以配置它仅在输入所有字符并保留输入后才更新? 问题答案: 更新资料 正如许多人提到的那样,Angular现在使用指令对此提供了内置支持。在这里查看更多。 下面的旧答案: ng-model没有内置选项来更改该行为,但是您可以编写一个自定义指令来执行此操作。@Gloopy 写了这样的指令。你可以在这里看看小提琴。 该指令从和事件中注销,这

  • 我试图使新值被选中后,调用eventChange()函数并将选中的值恢复为默认值。但会发生什么:ngModel值更新,但所选值保持不变。我应该如何使selected值和ngModel值相同? HTML文件 更新:以防万一的澄清:正在调用函数,但我想通过JavaScript更改所选选项。我尝试通过更改ngModel值来实现这一点,但即使ngModel值为cahnged时,所选选项也不会更改。

  • 问题内容: 输入如下: 当我手动键入并更改输入时,将执行。但是,如果我以编程方式通过其他功能更改了repair.test值,则不会触发ng- change的操作。我已经阅读了角度教程,这可能是预期的行为。 https://docs.angularjs.org/api/ng/directive/ng更改 “当值更改来自模型时,不评估表达式。” <-我也需要这个。模型以任何方式更改时,如何在控制器中触

  • 问题内容: 我将an 绑定到输入,但是绑定到该变量的值未在该指令声明的位置之外进行更新: 选择新日期时,仅内部会更新。外部的那个仍然是旧值(可能取决于我是否在控制器中声明了它,这无关紧要)。 我正在使用angular-materialize,我不确定这是否是问题的根源,但是没有意义,因为这是与CSS框架materializecss一起使用的特定的angular框架。 这是我正在使用的组件。 编辑: