#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])