Как создать свойство ember, зависящее от обычной переменной, функции или логики?
я работаю над листовкой для emberjs, а яУ меня возникли некоторые проблемы. Leaflet является внешней библиотекой и несколько не имеет отношения к вопросу, но просто знайте, что это библиотека отображений.
Рассмотрим простое свойство, например уровень масштабирования. Экземпляры листовки имеют уровень масштабирования, доступный черезmap.getZoom()
и назначается черезmap.setZoom(zoomLevel)
, Также пользователи могут взаимодействовать с картой и изменять ее масштаб. Листовка позволяет намзарегистрировать обратный звонок когда зум изменится.
Я хотел бы мойЭмбер-листовка» Посмотреть, чтобы иметьzoomLevel
тлеющее имущество. Таким образом, я могу извлечь выгоду из объектной модели Ember (связатьzoomLevel
к шаблону или к другому значению, например), и мыты делаешь это "угасающий путь ".
В настоящее время у меня есть подкласс Ember.View со свойством zoomLevel. НаdidInsertElement
Я создаю экземпляр карты Leaflet. Код комментируется и должен быть понятен.
App.Leaflet = Ember.View.extend({
classNames : ['ember-leaflet'],
//default zoom level
zoomLevel : 13,
didInsertElement : function() {
var self = this;
var zoomLevel = this.get('zoomLevel');
// create map instance
var map = L.map(this.$().get(0)).setView(center, zoomLevel);
// configure map instance...
// Event listeners
map.on('zoomend', function(e) {
self.set('zoomLevel', e.target.getZoom());
});
// save map instance
this.set('map', map);
}
});
контрольный списокЧтобы сделать этот вопрос больше "подотчетен»Я считаю, что решение этой проблемы должно отвечать следующим требованиям:
Когда собственностьzoomLevel
изменено, карта должна соответственно изменить свой уровень масштабирования (используя)map.setZoom(zoomLevel)
Когда пользователь в интерактивном режиме меняет масштаб на карте,zoomLevel
свойство должно быть изменено (возможно, с использованием карты листовкиzoomend
событие обратного вызова)Обратите внимание, что у нас здесь есть своего рода "круговая зависимость "то естьСделайте что-нибудь (setZoom на карте), когдаzoomLevel
изменения» а также "когда что-то происходит (пользователь изменяет масштаб), меняйтеzoomLevel
, Я хотел бы решение, которое могло бы избежать этой круговой зависимости наблюдателя. ЭмбераnotifyPropertyChange может быть решением.
Это казалось идеальной задачей дляЭмбер»s вычисленные свойствано я неНе знаю, что поместить в строку зависимых свойств.zoomLevel
в основном это свойство, которое зависит от того, что нетлеющая собственность.
Моя первая попытка состояла в том, чтобы использовать наблюдателя, чтобы установить увеличение листовки и привязать событие к листовке.zoomend
установитьzoomLevel
на мой взгляд.
Проблема: когда я устанавливаю zoomLevel на событие листовки zoomend, ям автоматически вызывает моего наблюдателя. Я ясно дал понять?
Итак, эта последовательность событий происходит:
менятьzoomLevel
на интерактивной картелистовка пожаровzoomend
событиеzoomend
обратный вызов события устанавливает emberzoomLevel
наблюдатель бежитизлишне звонитsetZoom
на листовкеЭто не эффективно, но я бы нене против, если это сработало. Проблема в том, что когда пользователь меняет масштаб несколько раз очень быстро (простая длинная прокрутка на карте), наблюдатель вызывается несколько раз,запутанная листовка.