Объединить несколько операторов просмотра угловой области

#javascript #angularjs #d3.js

#javascript #angularjs #d3.js

Вопрос:

У меня есть несколько разных операторов просмотра в директиве, которые просматривают scope и повторно отображают директиву d3 для разных событий (изменение размера окна, отправка формы и т. Д.)

 window.onresize = function() {
  scope.$apply();
};

// Call render function on window resize
scope.$watch(function() {
  return angular.element($window)[0].innerWidth;
}, function() {
  scope.render(scope.data);
});

// Watch for data changes and re-render
scope.$watch('data', function() {
  return scope.render(scope.data);
}, true);
 

Проблема в том, что я в конечном итоге вызываю render несколько раз для одного и того же события. Есть ли какой-либо способ объединить эти три разных $watches в более краткую структуру? Я догадывался, что просмотр scope также будет отслеживать data атрибут scope , но, видимо, нет! Почему это так?

Комментарии:

1. Я не уверен, что понимаю. Почему вы в конечном итоге вызываете несколько раз для одного и того же события. Связаны ли изменение размера окна и изменения «данных»? Если они являются отдельными событиями и взаимоисключающими, тогда ваш код должен работать нормально.

2. Нет, они не коррелируют… но я думаю scope.$watch... , что сегмент также вызывается при внесении изменений в данные. Я не думал, что это было изначально, но при data обновлении он запускает его дважды. По сути, мне просто интересно, есть ли способ объединить этот код.

3. scope.$watch(‘data’) будет вызываться при изменении данных. Когда еще это вызывается? Вы хотите сказать, что вы меняете данные и область видимости.$watch(‘data’) вызывается дважды?

Ответ №1:

Возможно, это не лучшее решение, но оно может помочь.

underscorejs’ throttle принимает функцию и минимальное время между выполнением функции и возвращает функцию, которая будет вызывать указанную функцию не чаще одного раза wait в миллисекунду.

 _.throttle(func, wait, [options])
 

Информация