给定下面的select元素

<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.name和size。控制器中的代码?

大小。代码会影响应用程序的许多其他部分(图像url等),但当item.size.code的ng-model更新时,item.size.name也需要更新面向用户的东西。我假设做到这一点的正确方法是捕获更改事件并在控制器中设置值,但我不确定我可以将什么传递到update以获得正确的值。

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


当前回答

而不是将ng-model设置为item.size。代码,如何设置它的大小:

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

然后在你的update()方法中,$scope。项将被设置为当前选定的项。

以及任何需要item。size的代码。Code,可以通过$scope.item.code获得该属性。

小提琴。

根据评论中的更多信息更新:

为你的select 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 ...
}

其他回答

这可能会给你一些启发

.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>

您需要使用“track by”,以便正确地比较对象。否则,Angular将使用原生js的方式来比较对象。

所以你的示例代码会变成-

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

AngularJS的Filter很适合我。

假设code/id是唯一的,我们可以用AngularJS的过滤器过滤掉特定的对象,并使用所选对象的属性。考虑上面的例子:

<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>

这里有三个重要的方面:

ng-init = "搜索。Code = item.size。Code " -在选择框外初始化h1元素时,将筛选器查询设置为所选选项。 ng-change = "更新(MAGIC_THING);搜索。Code = item.size。Code”—当您更改选择输入时,我们将运行另一行,将“search”查询设置为当前选择的item.size.code。 filter:search:true -将true传递给过滤器以启用严格匹配。

就是这样。如果大小。code是uniqueID,我们将只有一个h1元素的文本为size.name。

我已经在我的项目中进行了测试,它是有效的。

祝你好运

而不是将ng-model设置为item.size。代码,如何设置它的大小:

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

然后在你的update()方法中,$scope。项将被设置为当前选定的项。

以及任何需要item。size的代码。Code,可以通过$scope.item.code获得该属性。

小提琴。

根据评论中的更多信息更新:

为你的select 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 ...
}

这是从angular选择选项列表中获取值的最简洁的方法(除了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事件不识别选择中的选项项,我们使用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);
        };