【问题标题】:Ng-repeat not updating with array changesNg-repeat 不随数组更改而更新
【发布时间】:2016-08-16 20:37:18
【问题描述】:

我已经研究了这个问题好几个小时,并阅读了许多其他看起来完全一样的问题,我尝试了他们的每一个解决方案,但似乎都没有奏效。

我有一个对象数组 (instructionObj.instructions),这些对象与 ng-repeat 重复,它们的模板是一个指令。

<div instruction-directive ng-repeat="i in instructionsObj.instructions"> </div>

然后我允许使用 Jquery UI sortable 对项目进行排序。

var first, second;
$( ".sort" ).sortable({
  axis: "y",
  start: function( event, ui ) {
      first = ui.item.index();
  },
  stop: function( event, ui ) {
      second = ui.item.index();
      console.log(first + " " + second);
      rearrange(first, second);
      $scope.$apply();
  }
});

然后我访问被移动对象的开始和结束索引并相应地重新排列数组:

function rearrange(f, s){
    $timeout(function () {
        $scope.instructionsObj.instructions.splice(s, 0,
            $scope.instructionsObj.instructions.splice(f, 1)[0]);
        $scope.$apply();
    });
}

所有这些在大多数情况下都很有效。我发现失败的一种情况是重新排列对象时(一列是屏幕上显示的所有对象的当前位置):

一个 |乙 | c | d |一个

b | c | d | c | b

c | d |乙 |乙 | d

d |一个 |一个 |一个 | c

最后一步应该是a,d,c,b。但是会变成a, b, d, c。

但是,当我返回上一个视图并返回显示正确的配置时,一切都很好。如您所见,我尝试了$timeout$apply() 以及许多其他方法,但似乎都没有。

我知道这是一个 DOM 更新问题,因为我可以记录数组并查看它与 DOM 显示的内容不同(正确)(不正确)。任何帮助将不胜感激。

更新:

我什至使用&lt;pre ng-bind="instructionsObj.instructions|json&lt;/pre&gt; 来显示数组的确切布局,它总是正确的。我的心都碎了。

【问题讨论】:

  • 你能提供一个 plunkr 或 fiddle 或 Stackoverflow sn-p 吗?
  • 代码太多,很难,这就是为什么我只提供真正影响这一点的内容。我提供了 Ionic View 链接,因此任何人都可以下载该应用并进行测试。
  • 你不必把所有的代码都放在plunkr中,只需一个minimal reproducible example
  • 说比做好。我必须包括控制器、指令、app.js、css、index.html。这样它就像我看到的那样工作。

标签: javascript jquery arrays angularjs


【解决方案1】:

幸运的是,我找到了解决方案,尽管我不明白为什么会出现问题。

在这个 JS 中:

sortableEle = $('.sort').sortable({
    start: $scope.dragStart,
    update: $scope.dragEnd
});

$scope.dragStart = function(e, ui) {
    ui.item.data('start', ui.item.index());
}
$scope.dragEnd = function(e, ui) {
    var start = ui.item.data('start'),
        end = ui.item.index();

    $scope.instructionsObj.instructions.splice(end, 0,
        $scope.instructionsObj.instructions.splice(start, 1)[0]);
    currentRecipe.setInstructions($scope.instructionsObj.instructions);
    $scope.$apply();
    sortableEle.refresh();
}

我需要在更改数组后将$scope.$apply() 以及称为sortableEle.refresh()

再一次,我不明白为什么它会在 10% 的时间里搞砸,但它修复了它。

仅供参考:我稍微改变了 sortable 函数,但它的作用与以前完全相同。

【讨论】:

  • 如果您在 Angular 生命周期之外更改 $scope 值(就像您一样,来自 jQuery 可排序回调),您需要手动调用 $scope.$apply 以通知该特定 $scope 中的所有观察者有什么改变了。
  • 我已经打电话给$apply()。没有调用可排序刷新
  • 仅供参考,在使用 $apply 时,您应该尽可能使用回调函数语法。如果要“应用”的代码抛出异常,角度将不明智,也不会被捕获在您可能拥有的任何角度错误处理中。 (在带有 catch 的 Promise 链中最为突出)
猜你喜欢
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 2016-02-12
  • 1970-01-01
相关资源
最近更新 更多