Директива в ng-repeat не повторная обработка после обновления массива

0

У меня есть директива, которая преобразует определенные строки в теги ссылок (/). Я использую эту директиву внутри ng-repeat, чтобы добавить ссылки на текст в списке s. Однако я обновляю эти данные с сервера, который перезаписывает массив ng-repeat. Список обновляется в DOM, но текст больше не содержит в нем ссылок, как это было при обработке директивой. Как заставить директиву переработать текст для добавления ссылок?

Соответствующий код ниже

Контроллер HTML

<div ng-repeat="post in posts track by $index" ng-if="!post.deleted">
    <div  class="post wrap" ng-click="openSinglePostView(post, $index)" >
        <div class="post-desc" linkify="twitter" ng-bind="post.desc"></div>         
    </div>
</div>

Контроллер JS

$scope.posts = [];

function refresh(){ 
    $http.get(Constants.GET_POSTS_URL, {params : paramObject})
    .then(function (response){
        $scope.posts = [];
        for(var i = 0; i < response.data.resultsArray.length; i++){
            var post = new PostFactory(response.data.resultsArray[i]);
            $scope.posts.push(post);
        }
    });
}

refresh();

Код директивы

angular.module('linkify').directive('linkify', ['$filter', '$timeout', 'linkify', function ($filter, $timeout, linkify) {
    'use strict';

    return {
      //restrict: 'A',
      link: function (scope, element, attrs) {
        var type = attrs.linkify || 'normal';
        $timeout(function () { element.html(linkify[type](element.html()));
        });

      }
    };
  }]);

и для справки, директива использует эти фильтры и фабрики

angular.module('linkify')
  .filter('linkify', function (Constants) {
      'use strict';

      function linkify (_str, type) {
        if (!_str) {
          return;
        }

        var _text = _str.replace( /(?:https?\:\/\/|www\.)+(?![^\s]*?")([\w.,@?!^=%&amp;:\/~+#-]*[\w@?!^=%&amp;\/~+#-])?/ig, function(url) {
          var wrap = document.createElement('div');
          var anch = document.createElement('a');
          anch.href = url;
          anch.target = "_blank";
          anch.innerHTML = url;
          wrap.appendChild(anch);
          return wrap.innerHTML;
        });

        // bugfix
        if (!_text) {
          return '';
        }

        // Twitter
        if (type === 'twitter') {
          _text = _text.replace(/(|\s)*@([\u00C0-\u1FFF\w]+)/g, '$1<a href="https://twitter.com/$2" target="_blank">@$2</a>');
          _text = _text.replace(/(^|\s)*#([\u00C0-\u1FFF\w]+)/g, '$1<a href="https://twitter.com/search?q=%23$2" target="_blank">#$2</a>');
        }

        return _text;
      }

      //
      return function (text, type) {
        return linkify(text, type);
      };
  })
  .factory('linkify', ['$filter', function ($filter) {
    'use strict';

    function _linkifyAsType (type) {
      return function (str) {(type, str);
        return $filter('linkify')(str, type);
      };
    }

    return {
      twitter: _linkifyAsType('twitter'),
      icon: _linkifyAsType('icon'),
      normal: _linkifyAsType()
    };
  }])
Теги:
angular-directive
angularjs-ng-repeat

1 ответ

0

Может ли проблема отслеживать по индексу $ index? Вы пробовали без него?

  • 0
    Это решает проблему, но я включаю отслеживание по $ index, чтобы решить некоторые проблемы с производительностью больших списков. В идеале я хотел бы найти решение, которое работает, оставляя это в.
  • 0
    Будет ли работать ng-repeat = "запись в сообщениях, отслеживаемых по post.desc" вместо $ index?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню