【问题标题】:angular directive for each value in parent array keep in sync父数组中每个值的角度指令保持同步
【发布时间】:2016-03-16 13:31:03
【问题描述】:

我有一个包含数组的父对象,并且对于每个值,我呈现一个指令,通过隔离范围传入值。对于这个简单的演示,我只是将对象添加到控制器:

  $scope.schedule = {
    __type: "Fixed",
    ids: [101, 102, 103]
  }
})

还有指令:

    app.directive('picker', function() {

  return {
      scope:{
        import: '='
      },
      template:'<input ng-model="import" >'
  }
});

html:

  <div ng-repeat="i in schedule.ids">
    <picker import="i"></picker>  Bind: {{i}}
  </div>

我的实际问题是我有一个需要可重用的 datepicker 指令,因此对于呈现的每个 datepicker,我希望底层/原始数组在值更改时保持同步。我是不是搞错了?

正如您在小提琴中看到的那样,我渲染的指令与它们的隔离范围值保持同步,但它们形成的底层数组却没有,请在下面插入:

https://plnkr.co/edit/Nt9QwiBmlaW3PKPo8XRN?p=info

谢谢

【问题讨论】:

  • 你有原语数组(比如你的演示)或对象吗?因为它有很大的不同,需要不同的方法。

标签: javascript angularjs angularjs-directive


【解决方案1】:

由于数组的元素是基元,你需要引用实际的数组

<div ng-repeat="i in schedule.ids track by $index">
    <picker import="schedule.ids[$index]"></picker>  Bind: {{i}}
</div>

DEMO

【讨论】:

  • 啊,所以原语是按值复制的,即指令正在获取数组值的副本,并且通过语法跟踪使指令通过引用接收?我应该知道 :D 非常感谢
  • 不完全。跟踪仅有助于消化问题并提高性能。没有它,dom 会重新绘制每个按键,并且输入会失去焦点。 import 引用是允许对象具有 2 路绑定的部分
  • 我明白了,所以 schedule.ids [ $index] 部分创建了一个引用链接, schedule.ids[i] 将在其中传递值的副本?
【解决方案2】:

使用引用,而不是值,因为 Angular 会尝试浅拷贝该对象

<div ng-repeat="(index, value) in schedule.ids track by $index">
    <picker import="schedule.ids[index]"></picker>  Bind: {{value}}
</div>

import="i"schedule.ids 的浅拷贝,import="schedule.ids[index]"schedule.ids 的引用,

工作演示https://plnkr.co/edit/QX4Siu4xsJ6poQyy7Ljb?p=preview

【讨论】:

  • 使用track by 避免编辑时出现光标问题。尝试在输入中输入多个字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2022-01-18
  • 2017-04-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
相关资源
最近更新 更多