【问题标题】:Angular: How to bind to an entire object using ng-repeatAngular:如何使用 ng-repeat 绑定到整个对象
【发布时间】:2013-07-24 17:04:21
【问题描述】:

我刚刚开始在 Angular 中进行实验,并且对如何最好地使用 ng-repeat 进行绑定感到困惑。我基本上明白了关于 ng-repeat 创建子范围的观点。我的问题更基本:) 对于这样的 html:

<div ng-controller="swatchCtrl" class="swatch-panel">
    Swatches
    <ul>
        <li ng-repeat="swatch in swatchArray" class="swatch">
            <input
                type="radio"
                name="swatches"
                ng-model="$parent.currentSwatch"
                value="{{swatch}}"              
            >
            <label class="swatch-label">
                <div class="swatch-color" style="background-color: #{{swatch.hexvalue}};"></div
                ><span class="swatch-name">{{swatch.colorName}}</span> 
            </label>
        </li>
    </ul>

    currentSwatch is:
    <pre>{{currentSwatch | json}}</pre>

    currentSwatchObj is:
    <pre>{{currentSwatchObj | json}}</pre>
        how do I tell this to fire??

    swatchArray is:
    <pre>{{swatchArray | json}}</pre>
</div>

和像这样的javascript:

function swatchCtrl($scope) {
    $scope.swatchArray = [
        {colorName:'Red', hexvalue: 'ff0000', selected: 'false'},
        {colorName:'Green', hexvalue: '00ff00', selected: 'false'},
        {colorName:'Blue', hexvalue: '0000ff', selected: 'false'}
    ];

    $scope.currentSwatch = {};
}

http://jsfiddle.net/8VWnm/

我想:

a) 当用户单击单选按钮时,我希望它设置 currentSwatch 对象的 colorName 和 hexvalue 属性。现在绑定似乎给了我一个来自数组的字符串化对象。如何观察 currentSwatch 的返回,以便我可以将其解析回可用对象?很简单,我知道,但我错过了什么?

b) 当用户单击单选按钮时,我想我希望将原始数组中相应“选定”键的值设置为“真”。反之亦然取消选中。假设在调色板中一次只能选择一个样本。 (理论上我希望以后能够遍历数组,假设不同的键和值有时可能不是唯一的。)

这种东西用 jquery 方法超级简单,但我想学习惯用的角度方式。提前感谢您的帮助。

【问题讨论】:

  • 是什么让您认为currentSwatch 是字符串表示?您在
     标记中看到字符串的唯一原因是因为您使用了 json 过滤器,它只是在将其放在屏幕上之前将其转换为 JSON。控制器中的currentSwatch 实际上是一个对象。如果你删除| json,你会看到它把对象放在外面而不转义任何东西
  • 谢谢,你当然是对的......

标签: data-binding angularjs radio-button angularjs-ng-repeat


【解决方案1】:

http://jsfiddle.net/8VWnm/54/

我不会监听 ng-click 事件,而是将所选元素的索引设置为一个名为“currentSwatchIndex”的变量

<li ng-repeat="swatch in swatchArray" class="swatch">
    <input
        type="radio"
        ng-model="$parent.currentSwatchIndex"
        value="{{$index}}"              
    >
</li>

您可以 $watch 控制器中 currentSwatchIndex 的值变化,并在此 $watch 函数中设置选定的 swatch-Object 和选择状态:

$scope.$watch('currentSwatchIndex', function(newValue, oldValue) {
    $scope.currentSwatchObj = $scope.swatchArray[newValue];
    $scope.swatchArray[newValue].selected = true;
    $scope.swatchArray[oldValue].selected = false;
});

只知道 currentSwatchIndex 应该足以识别选定的 swatchObject。因此,您可能可以摆脱 swatchArray 的 currentSwatchObj 和 selected 属性。 您始终可以通过数组访问以编程方式获取选定的样本。

【讨论】:

  • 谢谢,简单而优雅。我担心在导入 swatch 库或对 swatchArray 进行排序/过滤操作时仅使用 swatchIndex 可能会变得很棘手,这是我在我的自学小教程中想象的。避免 ng-click 事件有什么实际优势,还是只是风格问题? (我想我也更愿意在数组中保留“selected”属性,作为使用 css 设置活动样本样式的一种方式。)
【解决方案2】:

对于将来可以来这里在选择中执行相同操作的用户,您不需要使用任何索引,选择必须像这样完成: http://docs.angularjs.org/api/ng.directive:select

【讨论】:

  • 谢谢,这正是我昨天和今天学习 Angular 时一直在摸索的问题。
  • 我很高兴它有帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多