【问题标题】:Unable to use 2 way binding on SELECT element in Angular JS programmably无法以编程方式在 Angular JS 中的 SELECT 元素上使用 2 路绑定
【发布时间】:2015-10-19 02:46:45
【问题描述】:

我很难让两种方式绑定为 SELECT 元素工作。我正在尝试以编程方式更改选定的元素。我找到了几个 Stackoverflow 示例,用于绑定 SELECT 的更改事件,但我并没有很多人采用其他方式,您的应用程序代码会更改所选元素。

我发现有一些在 OPTION 元素上使用 ng-repeat 但我 a) 无法让它工作,并且 b) 似乎不是“Angular 方式” .

HTML 代码:

<div ng-controller="SIController">
<select id="current-command" ng-model="currentCommand"
ng-options="c as c.label for c in availableCommands track by c.id"></select>
<button ng-click="changeSelectedOption()">Select "open"</button>

控制器代码:

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

function SIController($scope) {

    $scope.availableCommands = [
        {id: 'edit',        label: 'Edit'},
        {id: 'open',        label: 'Open'},
        {id: 'close',       label: 'Close'}
    ];

    $scope.currentCommand = "close";
    $scope.changeSelectedOption = function() {
        $scope.currentCommand = 'open';
    };  
};

我可以验证单击按钮时 $scope.currentCommand 正在更改,但似乎没有选择 OPTION。

Fiddle here

【问题讨论】:

    标签: javascript angularjs angularjs-ng-model angularjs-ng-options


    【解决方案1】:

    有没有工作小提琴:http://jsfiddle.net/bzhkkw18/9/

    为了解释我所做的事情,ng-click 和控制器中的函数名称不匹配。

    主要部分是您的选项的定义。在您的ng-options 中设置所有对象。如果这是您真正想要的,您必须在您的currentCommand 中执行相同的操作,如下所示:

    //Object 2 is close
    $scope.currentCommand = $scope.availableCommands[2];
    

    【讨论】:

    • 谢谢。我认为我的部分问题是,当数据从选择对象中流出(即点击它)时,它以一种格式出现,但通过 JavaScript 选择它需要不同的格式。看起来我可能需要做一些最小的重构。
    • 不客气。 currentCommand 需要相同的格式。但不同的是,在您的ng-model 上,您拥有所有对象。当你设置它时,你只贴标签。您只需要协调这些值。如果您想保存所有对象,我的答案是可以的。如果只想保存标签,则需要进行一些重构。
    • 我有一个后续问题。在我的真实应用程序中,数据绑定正在工作,但只有在我调用其他命令时才会发生。为了让我在模型更改时使其工作,我需要调用 $scope.$apply() 但我不明白为什么,我宁愿它是自动的。该方法是从处理键绑定的第三方库调用的。
    【解决方案2】:

    我最近遇到了类似的问题。看看我的answer。您应该修改定义 ng-options 的方式。

    function MyCtrl($scope) {
        $scope.values = [
            {name : "Daily", id : 1},
            {name : "Weekly", id : 2},
            {name : "Monthly", id : 3},
            {name : "Yearly", id : 4}];
        $scope.selectedItem = $scope.values[0].id;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script>
    <div ng-app ng-controller="MyCtrl">
        <select ng-model="selectedItem" ng-options="selectedItem.id as selectedItem.name for selectedItem in values"></select>
        selectedItem: {{selectedItem}}
    </div>

    【讨论】:

    • 这真的取决于你想要进入“selectedItem”的内容。如果你想要一个id,这是一个好方法。如果您需要整个对象,则需要保留第一种语法。
    • @Okazari 当您执行 'ng-options="selectedItem as ....' 时,它会绑定到 whle 对象。
    • 是的,但我只是想发出警告。您的示例只会将“in”放入“selectedItem”中,这可能不是操作想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多