如何阻止Angular清除文本选择?

时间:2015-06-06 20:19:52

标签: javascript angularjs

我尝试使用Angular每隔几秒渲染和刷新一个复杂对象列表。我发现的一个问题是,当刷新发生时,即使特定的HTML子组件没有更改,HTML也会更新,如果您选择了某些文本(例如,您试图复制它)选择消失了。

我知道更改包含选择的html存在一个普遍问题,但我想知道Angular是否能解决我不知道的问题。基本上我正在寻找的只是实际更改的HTML。如果我在jQuery中手动编写视图代码,我可以这样做,但手动执行它的其他任何部分都很糟糕

JS:

angular.module('items', [])
.factory('itemList', ['$http', function($http) {
  var items = [];
  var refresh = function() {
    // imagine that this makes an HTTP call to get the new list
    // of items
    items.length = 0;
    for (var i = 0; i < 10; i++) {
      items.push("item " + Math.random(1, 10))
    }
  }
  refresh();
  return {
    items: items,
    refresh: refresh
  };
}]);


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

app.controller('ItemListController',
  ['$scope', 'itemList', '$interval',
  function($scope, itemList, $interval) {
    this.items = itemList.items;
    $interval(itemList.refresh, 2000)
  }
]);

HTML:

<body ng-app="app">
<div ng-controller="ItemListController as controller">
  <h3>Items</h3>
  <div ng-model="active">
    <div ng-repeat="item in controller.items">
        <div class="header">Header</div>
        <div>{{item}}</div>
        <hr/>
    </div>
  </div>
</div>

</body>

3 个答案:

答案 0 :(得分:1)

当你在每次刷新时批量替换itemList时,angular没有选项,只能重新创建ng-repeat中的所有元素,如果你不介意丢失选择并且刷新不是太大而且贵。为了防止这种情况,您可以尝试在该工厂中编写一个合并,将前一个版本与新版本区分开来,并添加/删除项目而不替换整个引用。然后,只有当您选择的项目不再存在时,您才会失去选择。

此外,如果列表很长并且从刷新到刷新的差异很小,那么这可能会更有效。

答案 1 :(得分:0)

$ interval刷新整个DOM因此刷新选择并显示新值。   如果要选择然后取消特定时间间隔$ interval.cancel(毫秒),则重新启动具有所选范围的计时器。

$scope.$watch("refresh", function(){
           $interval.cancel(5000);
          p = $interval(itemsList.refresh(), 2000);
        })

答案 2 :(得分:0)

我明白了。 Thor的回答是在正确的轨道上。问题是我没有在我的ng-repeat上使用“FOO的跟踪”,所以它无法知道我的实际情况中复杂对象的元素是否相同,因此它重新绘制了它们