Как создать свойство 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 на листовке

Это неэффективно, но я не против, если это сработает. Проблема в том, что когда пользователь меняет масштаб несколько раз очень быстро (простая длинная прокрутка на карте), наблюдатель вызывается несколько раз,запутанная листовка.

Ответы на вопрос(3)

Ваш ответ на вопрос