Как создать свойство ember, зависящее от обычной переменной, функции или логики?
Я работаю над листовки для emberjs, и у меня возникли некоторые проблемы. Leaflet является внешней библиотекой и несколько не имеет отношения к вопросу, но просто знайте, что это библиотека отображений.
Рассмотрим простое свойство, например уровень масштабирования. Экземпляры листовки имеют уровень масштабирования, доступный черезmap.getZoom()
и назначается черезmap.setZoom(zoomLevel)
, Также пользователи могут взаимодействовать с картой и изменять ее масштаб. Листовка позволяет намзарегистрировать обратный звонок когда зум изменится.
Я хотел бы, чтобы мой "Ember-Leaflet" View имел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 может быть решением.
Это казалось идеальной задачей дляEmber вычислил свойства, но я не знал, что поместить в строку зависимых свойств.zoomLevel
в основном это свойство, которое зависит от чего-то, что не является свойством ember.
Моя первая попытка состояла в том, чтобы использовать наблюдателя, чтобы установить увеличение листовки и привязать событие к листовке.zoomend
установитьzoomLevel
на мой взгляд.
Проблема: Когда я устанавливаю zoomLevel на событие листовки zoomend, я снова автоматически запускаю моего наблюдателя. Я ясно дал понять?
Итак, эта последовательность событий происходит:
менятьzoomLevel
на интерактивной картелистовки пожарыzoomend
мероприятиеzoomend
обратный вызов события устанавливает emberzoomLevel
наблюдатель бежитизлишне звонитsetZoom
на листовкеЭто неэффективно, но я не против, если это сработает. Проблема в том, что когда пользователь меняет масштаб несколько раз очень быстро (простая длинная прокрутка на карте), наблюдатель вызывается несколько раз,запутанная листовка.