【问题标题】:Is there a way to 2-way bind $index from ng-repeat on a model without javascript, using AngularJS?有没有办法使用AngularJS在没有javascript的模型上从ng-repeat双向绑定$index?
【发布时间】:2015-07-17 04:32:14
【问题描述】:

我想要一个这样的 dom 元素列表:

<div ng-repeat="element in elements track by $index" 
     data-index="$index" ng-init="element.order = $index"> </div>

If the elements are 3 then
elements[0].order = 0;
elements[1].order = 1;
elements[2].order = 2;

我正在尝试在“订单”字段的每个元素上绑定 $index。显然 data-index 不是 2-way binding 并且在我的代码中将元素替换为新对象后 ng-init 效果消失。我希望能够根据 DOM 顺序自动更改元素的“顺序”字段(例如,如果我有拖放重新排序机制)。仅在 HTML 中使用角度绑定,如何在没有 Javascript 的情况下完成此操作?

【问题讨论】:

  • 角度是javascript。
  • 很明显.. 它不仅仅是 javascript.. 我的意思是没有 ctrl/directive javascript 代码..
  • 我不需要。但是,这有意义吗:-
  • 这不会自动将它绑定到模型..

标签: angularjs angularjs-ng-repeat ng-repeat


【解决方案1】:

我在 git (https://github.com/angular/angular.js/issues/12312) 中提出了这个问题,Angular 团队回应说有核心支持:

ng-attr-xxx可用于绑定html订单字段和模型订单字段

所以这个:

<div ng-repeat="element in elements track by $index" ng-attr-xxx="element.order = $index"> </div>

正在做我想做的事。

:)

【讨论】:

    【解决方案2】:

    也许你想要这样的东西?

    <div ng-repeat="element in elements track by $index | orderBy:'order'" ng-model="element.order" ng-init="element.order = $index"></div>
    

    虽然使用ng-init 被认为是不好的,所以我不建议这样做。您应该改为在控制器中对其进行初始化。

    【讨论】:

    • 让我试试 - 编辑:ng-model 对表达式无效
    • 我不认为ng-model可以是一个表达式
    • @MichailMichailidis 立即尝试
    • @Chrillewoodz ng-model 从未初始化订单 .. 只有 ng-init 会这样做,但如果我用新对象替换对象,它就会丢失
    • 这里好像在问不可能,有不想用js的理由吗?
    【解决方案3】:

    为什么需要绑定它?您始终可以使用 indexOf 获取数组中元素的索引

    var elements = [100,200,300,400];
    var index = elements.indexOf(200); // 1
    

    如果你需要 HTML 中的值,你也可以在那里使用它

    <div ng-show="elements.indexOf(element) == 3">
    

    【讨论】:

    • 好吧,如果我必须为此引入任何 javascript,那么我知道有很多方法可以做到这一点。不过谢谢
    • 我不是建议使用 JS。我在问你为什么要存储你已经拥有/可以随时检索的东西?
    • 好吧,如果我使用一些 javascript 并移动东西或删除元素,我将不得不使索引保持一致和连续.. 我不知道我是否使用 splice 数组的索引将如何工作
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签