2013-10-01 3 views
3

У меня есть вопрос к библиотеке ember-leaflet и правильному использованию всплывающих окон.Рендеринг шаблона просмотра или руля в листовке всплывающего окна

Следующий пример из ember-leaflet website использует библиотеку для добавления маркеров и связанных всплывающих окон. Он также иллюстрирует, как добавлять контент для всплывающих окон посредством привязки содержимого.

RadMarkersApp = Ember.Application.create(); 
RadMarkersApp.MarkerLayer = 
    EmberLeaflet.MarkerLayer.extend(
    EmberLeaflet.DraggableMixin, 
    EmberLeaflet.PopupMixin, { 
    popupContentBinding: 'content.title' 
}); 

RadMarkersApp.MarkerCollectionLayer = 
    EmberLeaflet.MarkerCollectionLayer.extend({ 
    content: [{ 
     location: L.latLng(40.7127, -74.0060), 
     title: 'City Hall'}], 
    itemLayerClass: RadMarkersApp.MarkerLayer 
    }); 

RadMarkersApp.IndexView = 
    EmberLeaflet.MapView.extend({ 
    childLayers: [ 
     EmberLeaflet.DefaultTileLayer, 
     RadMarkersApp.MarkerCollectionLayer]}); 

Теперь я хотел бы иметь возможность использовать представление или шаблон Рули для popupContent собственности здесь. Есть ли у кого-нибудь идеи, как это реализовать? Есть ли наилучшие методы для этого сценария?

Мой первый подход:

App.MarkerLayer = 
    EmberLeaflet.MarkerLayer.extend(
    EmberLeaflet.PopupMixin, { 

    popupContent: function() { 
     // Render view (how to get?) or handlebars template 
     return Ember.TEMPLATES['popup-content'](this.get('content')) 
    }.property() 
    }); 

Это приводит к следующей ошибке:

Uncaught TypeError: Cannot call method 'push' of undefined 

Надежда кто-то может помочь. Заранее спасибо!

ответ

3

Я немного идиот, не в состоянии найти полезные функции в документации.

я был в состоянии исправить это с небольшой хак и помощью Ember.View#createElement:

App.MarkerLayer = EmberLeaflet.MarkerLayer.extend(EmberLeaflet.PopupMixin, { 
    popupContent: function() { 
    view = this.view = this._parentLayer.createChildView('map-popup'); 
    view.set('context', this.get('content')); 
    Ember.View.states.inDOM.enter(view) 
    view.createElement(); 

    return view.get('element'); 
    }.property() 
}); 

Надеется, что это поможет другим.

+0

Кажется немного «взломанным» для меня. Похоже, что он возится с внутренним состоянием Эмбера (я мог ошибаться, как новичок в Ember). В любом случае, вы когда-нибудь находили более чистый/лучший способ сделать это? – elsurudo

+0

Просто попробовал это и получил следующую ошибку: «Неподготовлено TypeError: Object [object Object] не имеет метода« createChildView »». Советы? – elsurudo

+0

Исправлено, заменив вашу первую строку в функции «view = this.view = this._parentLayer.createChildLayer (App.MapPopupView)». Возможно, из-за версий Ember ... Я получаю предупреждение о том, что «Использование defaultContainer больше не поддерживается. [DefaultContainer # lookup] см. Http://git.io/EKPpnA". Не знаю, что это значит, но придется заглядывать в него. – elsurudo