获取通过ng-change选择的ng对象


313

给定以下选择元素

<select ng-options="size.code as size.name for size in sizes " 
        ng-model="item.size.code" 
        ng-change="update(MAGIC_THING)">
</select>

有没有办法使MAGIC_THING等于当前选择的大小,因此我可以访问size.namesize.code在我的控制器中?

size.code影响了应用程序的许多其他部分(图像网址等),但是当的ng-model item.size.code更新时,item.size.name面向用户的东西也需要更新。我认为执行此操作的正确方法是捕获更改事件并在控制器内部设置值,但是我不确定可以将哪些内容传递给update以获取正确的值。

如果这完全是错误的解决方法,我很想知道正确的方法。

Answers:


488

与其将ng-model设置为item.size.code,不如将其设置为size:

<select ng-options="size as size.name for size in sizes" 
   ng-model="item" ng-change="update()"></select>

然后在您的update()方法中,$scope.item将其设置为当前选定的项目。

而且,无论需要什么代码item.size.code,都可以通过来获得该属性$scope.item.code

小提琴

根据评论中的更多信息进行更新

为您选择的ng-model使用其他$ scope属性,然后:

<select ng-options="size as size.name for size in sizes" 
   ng-model="selectedItem" ng-change="update()"></select>

控制器:

$scope.update = function() {
   $scope.item.size.code = $scope.selectedItem.code
   // use $scope.selectedItem.code and $scope.selectedItem.name here
   // for other stuff ...
}

1
如果将模型设置为项目,如何预选一个值?
Patrick

5
将其放入您的<select>:ng-init =“ item = sizes [0]”
Mark Rajcok 2013年

非常感谢您的帮助,但我认为我对这种情况的看法不够。item是创建的页面加载对象。对象的sizes数组是在用户与编辑按钮交互时出现的,因此,如果执行此操作,它将覆盖整个项目对象。我需要一种在选择框中创建一堆选项的方法,该选择框从数据对象的完全独立的部分中预选择一个值。
Patrick

14
这是真的?似乎在ng-model更新之前会触发ng-change处理程序,因此尝试$ scope.item.size.code = $ scope.selectedItem.code可能并不总是为您提供更新后的模型值。有人在使用ng-change时看到过吗?
卡尔,

6
猜猜也没有什么可以阻止您这样做:ng-model="selectedItem" ng-change="update(selectedItem)"
Rhys van der Waerden 2014年

52

您还可以使用以下代码直接获取所选值

 <select ng-options='t.name for t in templates'
                  ng-change='selectedTemplate(t.url)'></select>

script.js

 $scope.selectedTemplate = function(pTemplate) {
    //Your logic
    alert('Template Url is : '+pTemplate);
}

5
这回答了问题,而被
接受者

1
您在哪里初始化或获取模板变量?
Kat Lim Ruiz 2014年

29
在不指定模型的情况下是否可以正常工作?我收到此错误:找不到指令'select'所需的控制器'ngModel'!
2014年

8
根据文档,选择元素绝对需要ngModel。其他指令是可选的,但不是。
mnemia

26
这行不通!ng-change无权访问ng-options内部创建的临时变量(t)。
垃圾

16

您也可以尝试以下方法:

<select  ng-model="selectedItem" ng-change="update()">
<option ng-repeat="item in items" ng-selected="selectedItem == item.Id" value="{{item.Id}}">{{item.Name}}</option>
</select>

2
如果您需要格式化值,则此解决方案很好。仅使用选择方法,我无法轻松设置值的格式。
mbokil '16


2
<select ng-model="item.size.code">
<option ng-repeat="size in sizes" ng-attr-value="size.code">{{size.name}}          </option>
</select>

11
在选择中使用ng-options而不是ng-repeat。
捷普贝纳迪诺2014年

12
@JepserBernardino有时您需要更好地访问<option>,例如,对某些特殊/默认选项进行样式设置,无论是否选择了这些选项
Ekus 2014年

2

//Javascript
$scope.update = function () {
    $scope.myItem;
    alert('Hello');
}
<!--HTML-->
<div class="form-group">
     <select name="name"
             id="id" 
             ng-model="myItem" 
             ng-options="size as size.name for size in sizes"
             class="form-control" 
             ng-change="update()"
             multiple
             required>
     </select>
</div>

如果要编写,名称,ID,类,多个,必需的,可以用这种方式编写。


1

这可能会给你一些想法

.NET C#视图模型

public class DepartmentViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
}

.NET C#Web Api控制器

public class DepartmentController : BaseApiController
{
    [HttpGet]
    public HttpResponseMessage Get()
    {
        var sms = Ctx.Departments;

        var vms = new List<DepartmentViewModel>();

        foreach (var sm in sms)
        {
            var vm = new DepartmentViewModel()
            {
                Id = sm.Id,
                Name = sm.DepartmentName
            };
            vms.Add(vm);
        }

        return Request.CreateResponse(HttpStatusCode.OK, vms);
    }

}

角度控制器:

$http.get('/api/department').then(
    function (response) {
        $scope.departments = response.data;
    },
    function (response) {
        toaster.pop('error', "Error", "An unexpected error occurred.");
    }
);

$http.get('/api/getTravelerInformation', { params: { id: $routeParams.userKey } }).then(
   function (response) {
       $scope.request = response.data;
       $scope.travelerDepartment = underscoreService.findWhere($scope.departments, { Id: $scope.request.TravelerDepartmentId });
   },
    function (response) {
        toaster.pop('error', "Error", "An unexpected error occurred.");
    }
);

角度模板:

<div class="form-group">
    <label>Department</label>
    <div class="left-inner-addon">
        <i class="glyphicon glyphicon-hand-up"></i>
        <select ng-model="travelerDepartment"
                ng-options="department.Name for department in departments track by department.Id"
                ng-init="request.TravelerDepartmentId = travelerDepartment.Id"
                ng-change="request.TravelerDepartmentId = travelerDepartment.Id"
                class="form-control">
            <option value=""></option>
        </select>
    </div>
</div>

1

您需要使用“跟踪依据”,以便可以正确比较对象。否则,Angular将使用本机js比较对象的方式。

因此您的示例代码将更改为-

    <select ng-options="size.code as size.name
 for size in sizes track by size.code" 
ng-model="item.size.code"></select>

1

AngularJS的Filter为我解决了。

假设code/id独一无二的,我们可以过滤掉与AngularJS的特定对象filter和工作与所选择的对象的属性。考虑上面的示例:

<select ng-options="size.code as size.name for size in sizes" 
        ng-model="item.size.code" 
        ng-change="update(MAGIC_THING); search.code = item.size.code">
</select>

<!-- OUTSIDE THE SELECT BOX -->

<h1 ng-repeat="size in sizes | filter:search:true"
    ng-init="search.code = item.size.code">
  {{size.name}}
</h1>

现在,有3个重要方面

  1. ng-init="search.code = item.size.code"-在框h1外初始化元素时select,将过滤器查询设置为所选选项

  2. ng-change="update(MAGIC_THING); search.code = item.size.code"-当您更改选择输入时,我们将再执行一行,将“搜索”查询设置为当前选择的item.size.code

  3. filter:search:true-传递true到过滤器以启用严格匹配

而已。如果的size.code值为uniqueID,则只有一个h1元素为的文本size.name

我已经在我的项目中对此进行了测试,并且可以正常工作。

祝好运


0

这是从角度选择选项列表(“ Id”或“ Text”除外)中获取值的最干净的方法。假设您的页面上有这样的产品选择:

<select ng-model="data.ProductId"
        ng-options="product.Id as product.Name for product in productsList"
        ng-change="onSelectChange()">
</select>

然后在您的控制器中设置回调函数,如下所示:

    $scope.onSelectChange = function () {
        var filteredData = $scope.productsList.filter(function (response) {
            return response.Id === $scope.data.ProductId;
        })
        console.log(filteredData[0].ProductColor);
    }

简单说明:由于ng-change事件无法识别select中的选项项,因此我们使用ngModel从控制器中加载的选项列表中过滤出选定的项。

此外,由于该事件是在ngModel真正更新之前触发的,因此您可能会得到不想要的结果,因此,更好的方法是添加一个超时:

        $scope.onSelectChange = function () {
            $timeout(function () {
            var filteredData = $scope.productsList.filter(function (response) {
                return response.Id === $scope.data.ProductId;
            })
            console.log(filteredData[0].ProductColor);
            }, 100);
        };
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.