11

假设我们有一组通过项目服务公开的项目:

{ id: '123', name: 'Yeoman', watchers: '1233', ... }
{ id: '123', name: 'Grunt', watchers: '4343', ... }

然后,我们有一个表格来选择您喜欢的项目:

Select favorite project:
%label.radio(ng-repeat="project in Project.query()")
  %input(type="radio" ng-model="data.favoriteProject" value="{{project.id}}") {{project.name}}

这会将choices.favoriteProject 设置为所选项目的id 值。通常,我们需要访问相关对象,而不仅仅是 id:

John's favorite project:
{{Project.get(data.favoriteProject).name}}

我正在寻找的是一种将收音机和复选框直接绑定到对象本身而不是 id 的方法,所以我们可以这样做

John's favorite project:
{{data.favoriteProject.name}}

反而。这可以通过 ng-options 使用 select 指令来实现,但是我们如何使用收音机和复选框来做到这一点?如果可能的话,我仍然想使用 id 进行匹配而不是引用。

为了澄清,这是我正在寻找的一个例子

Select favorite project:
%label.radio(ng-repeat="project in Project.query()")
  %input(type="radio" ng-model="data.favoriteProject" value="{{project}}" ng-match="id") {{project.name}}

它说:“请将 data.favoriteProject 绑定到实际的项目对象并使用 id 检查它们是否匹配(而不是引用)”。

4

2 回答 2

15

[更新]

ngValue在发现似乎没有记录的指令后,我完全改变了我的答案。它允许您绑定对象,而不仅仅是字符串作为ngModel单选按钮输入的值。

<label ng-repeat="project in projects">
  <input type="radio" ng-model="data.favoriteProject"
    ng-value="project">{{project.name}}</input>
</label>

<p>Your favorite project is {{data.favoriteProject.name}}.</p>

这使用引用来检查,而不仅仅是 ID,但我认为在大多数情况下,这就是人们要寻找的。如果您非常严格地只想根据 ID 进行匹配,您可以使用下面的[Old Answer],或者甚至更好,只需创建一个函数——例如projectById(projectId),您可以使用它来根据其 ID 查找项目。

我已经更新了 JSFiddle 来演示:http: //jsfiddle.net/BinaryMuse/pj2GR/


[旧答案]

也许您可以利用ng-change单选按钮指令的属性来实现您想要的。考虑这个 HTML:

<p>Select your favorite project:</p>
<label ng-repeat="project in projects">
  <input type="radio" ng-model="data.favoriteProjectId" value="{{project.id}}"
         ng-change="data.favoriteProject = project">
    {{project.name}}
  </input>
</label>

<p>Your favorite project is {{data.favoriteProject.name}}.</p>

ng-change例如,您也可以在内部调用一个函数setfavoriteProject(project)——但为了简单起见,我在这里没有这样做。

这是一个演示该技术的工作 jsFiddle:http: //jsfiddle.net/BinaryMuse/pj2GR/7/

于 2013-01-16T06:20:43.240 回答
1

不需要 ng-change(而且我不确定,编写这样的内联代码是否是一种好习惯。另一方面,角度指令本身离它并不太远)。为什么不这样做(也适用于 ng-repeat):

小提琴:http: //jsfiddle.net/JohannesJo/VeZxh/3/

代码:

<body ng-app="app">
<div ng-controller='controller'>
<input type = "radio" ng-model = "oSelected"  value = "{{aData[0]}}">
<input type = "radio" ng-model = "oSelected"  value = "{{aData[1]}}">
<div>test:     {{oSelected}}</div>
</div>
</body>


app = angular.module('app',[]);

app.controller('controller', function($scope){
$scope.aData = [
    {o:1},
    {o:2}
];
$scope.oSelected = {};
});

编辑:我也许应该提到这不适用于复选框,因为值将是真或假。此外,共享模型将导致所有复选框同时被选中或取消选中。

于 2013-02-28T21:08:58.963 回答