2014-02-16 3 views
3

У меня есть компонент, который выложен с использованием polymer-grid-layout, который содержит холст в качестве основной части содержимого. Я хочу, чтобы холст автоматически изменял размер в зависимости от размера, который выделяет polymer-grid-layout.Автоизображение холста внутри полимерной сетки

Я не могу положить width:100%; height:100% на холст, так как это просто растягивает холст, делая его искаженным и зернистым. Вместо этого я завернул div вокруг холста и вручную изменил размер холста на основе размера div в коде.

код выглядит как (заметьте, я ушел из котла пластины, как и т.д.)

<polymer-grid-layout xnodes="{{xnodes}}" 
    layout="[[1, 2, 3], 
       [4, 4, 4]]"> 
</polymer-grid-layout> 

<gauge-slider id='front' label='Front'></gauge-slider> 
<panel flex></panel> 
<gauge-slider id='back' label='Back'></gauge-slider> 

<canvas-view id="canvasView" canvasModel="{{canvasModel}}" flex></canvas-view> 

где холст ракурс содержит

<panel id="canvasContainer" flex> 
    <canvas id="canvas"></canvas> 
</panel> 

В холсте вид дротика кода I установите ширину полотна таким образом

void _resize() { 
    canvas.width = canvasContainer.clientWidth; 
    canvas.height = canvasContainer.clientHeight; 

    _redraw(); 
} 

, который я LL от

@override 
void ready() { 
    canvas = $['canvas']; 
    canvasContainer = $['canvasContainer']; 

    // doesn't seem to be a resize on anything other than window!?! 
    window.onResize.listen((_) => _resize()); 
} 

и от

@published void set canvasModel(CanvasModel m) { 
    _canvasModel = m; 

    // TODO: need to build in a delay as otherwise the containing div has not been sized properly yet 
    new Timer(new Duration(milliseconds: 50), _resize); 
} 

проблема в приведенном выше коде. Если я вызываю _resize прямо здесь, то контейнер div еще не знает, что это правильная высота. После экспериментов я обнаружил, что 50 миллисекунд позволяет правильному размеру контейнера на макете сетки на моей машине, но это кажется действительно изворотливым и может быть проблематичным на разных устройствах.

Как я могу избежать этой задержки? Есть ли какое-то событие, которое я могу прослушать, это говорит мне, когда макет сетки закончил калибровку компонентов?

Также был ли более простой способ добиться изменения размера холста в первую очередь?

Наконец, мне нужно было создать панель canvasContainer, чтобы иметь 0 полей, границу и т. Д. Есть ли способ получить внутренние размеры этого контейнера?

+0

Я добавил полимерный тег, чтобы сделать его более вероятно, что и оригинальные дизайнеры элементов тоже видят вопрос. –

+0

thanks @ GünterZöchbauer – Anders

+0

Если он не работает, как объяснил @ScottMiles, создайте проблему в polym_ui_elements, и я посмотрю, обновляется ли этот компонент. –

ответ

3

Есть ли какое-то событие, которое я могу прослушать, сообщает мне, когда макет сетки закончил калибровку компонентов?

Макет сетки отправляет событие polymer-grid-layout после того, как он закончил настройку размеров.

Также был ли более простой способ добиться изменения размера холста в первую очередь?

Я так не думаю, но, возможно, эксперт по холсту будет перекликаться с лучшими советами.

Наконец, мне нужно было создать панель canvasContainer, чтобы иметь 0 полей, границу и т. Д. Есть ли способ получить внутренние размеры этого контейнера?

clientWidth/Height игнорирует поля и границу, но делает подсчет дополнений.Существуют и другие способы измерения ящиков, но они быстро усложняются (в основном из-за проблем с x-браузером). Это может быть трудная тема, вот стартовая ссылка: https://developer.mozilla.org/en-US/docs/Determining_the_dimensions_of_elements

+0

благодарит за вашу помощь @ScottMiles. Я попробую это скоро – Anders

+0

Одна проблема с применением этого. Компонент, имеющий холст, представляет собой компонент низкого уровня, который может использоваться в любом макете. Макет сетки содержится в компоненте более высокого уровня. Поэтому мне пришлось бы слушать это событие, а затем вызвать цепочку меток layoutChanged, чтобы перейти к компоненту холста. Не идеально. Было бы неплохо, если бы у PolymerElement был метод layoutChanged или аналогичный метод, который вы могли бы переопределить, в который будут вноситься все разные макеты. Это было бы проще и более модульным. Мысли? – Anders

+0

Я согласен, и мы планируем добавить какой-то «layoutChanged» или аналогичный каскад для обработки этих ситуаций. В то же время обратите внимание, что когда у вас есть раздражающая «цепочка методов/привязок/etc», обычно вокруг нее есть способ. Например, вы можете использовать элемент «polymer-signals» для отправки сигналов слушателям в любом месте DOM (http://jsbin.com/deg/1/edit). –

Смежные вопросы