2014-06-30 2 views
1

다음과 같이 정의 된 RPG 기본 HTML 요소가 있습니다. 내 index.html 파일의 본문에서 인스턴스화하고 있습니다. 다른 사용자 정의 요소의 템플리트에서 인스턴스화 될 때 하위 요소를 탐지하지 못하는 사용자 정의 요소

<link rel="import" href="packages/polymer/polymer.html"> 
<link rel="import" href="gridlayout.html"> 
<link rel="import" href="gridtile.html"> 


<polymer-element name="rpg-main" attributes=""> 
    <template> 
    <style> 
     grid-tile { 
     background: #FF00FF; 
     width: 50px; 
     height: 50px  
     } 
    :host { 
     position: absolute; 
     display: block; 
     width: 500px; 
     height: 500px; 
     } 

    </style> 
    <grid-layout rows = "2" cols = "2" spacing = "50px"> 
     <grid-tile> 
     </grid-tile> 
     <grid-tile> 
     </grid-tile> 
     <grid-tile> 
     </grid-tile> 
     <grid-tile> 
     </grid-tile> 
    </grid-layout> 
    </template> 
    <script type="application/dart" src="rpgmain.dart"></script> 
</polymer-element> 

사람이 기대하는 것처럼

는 또한 정의 그리드 레이아웃과 그리드 타일 요소를 가지고있다. 그리드 레이아웃 생성자에서 그 자식을 참조하려고합니다. 그러나 요소는 위의 rpg-main 클래스에서 인스턴스화 될 때 자식이 0이라고 생각합니다.

import 'package:polymer/polymer.dart'; 
import 'dart:html'; 

@CustomTag('grid-layout') 
class GridLayout extends PolymerElement { 
    @published int rows; 
    @published int cols; 
    @published int spacing; 

    String _px = "px"; 
    String _perc = "%"; 

    GridLayout.created() : super.created() { 

    print("NUM CHILDREN " + this.children.length.toString()); 

    /** for (int i = 0; i <= this.rows + this.cols - 2; i++) { 
     Element child = this.children[i]; 
     this.children[i].style.margin = this._parseNum(spacing); 
     child.style.float = "right"; 

     if (i % this.rows == this.rows) { 
     child.style.clear = "right"; 
     } 


    }**/ 
    } 
    num _parseString(String s) { 
    print(s.toString()); 
    return num.parse(s.split(_px)[0]); 
    } 

    String _parseNum(num n) { 
    return n.toString() + _px; 
    } 
} 

*** 위의 코드 인쇄 "NUM 어린이 : 0"그것은 단지 내 롤 플레잉 - 주요 요소에서 인스턴스화하는 것을, 그래서 내가 같이 그리드 타일을 인식하지 않을 놀랐어요

어린이. grid-layout 요소가 rpg-main 사용자 정의 요소의 템플리트 태그에서 인스턴스화되기 때문일 수 있습니까? (그래서 그리드 레이아웃은 그 아이들이 '라이트 돔'에 있다고 생각하지 않습니까?) 그것은 수치 스럽습니다. 그렇다면 해결 방법은 무엇입니까?

+0

대답도 볼 수 있지만,이 작업으로 도움이 될 수 있습니다 https : //로 github.com/cletusw/rpg – CletusW

+0

안녕하세요. 아주 멋집니다. 일반적으로 Polymer는 어떻게 이런 종류의 것을 찾았습니까? 그것이 이전 html5보다 객체 지향 프로그래밍과 비슷하기 때문에 게임에 잘 적응할 수 있다고 생각했습니다. –

+0

지금까지 좋은 방법이었습니다. 실제 게임의 크기와 복잡성으로 확장하려고하면 성능 문제가 발생할 것이라고 생각합니다. – CletusW

답변

1

생성자가 잘못된 위치에 있습니다. 요소를 사용하기 전에 요소를 올바르게 초기화해야합니다.

시도

@override 
void attached() { 
    super.attached(); 
    print("NUM CHILDREN " + this.children.length.toString()); 
} 

이 Justins이 좀 오래되어 대신 다트의 JS 여기에 When is shadowRoot available to a polymer component?

+0

감사합니다. 아직 시도하지 않았지만 (나는 제대로 작동 할 것이라고 확신한다.) 그러나 나는 또 다른 질문을 가지고있다. 미안 기본 DOM 물건,하지만 먼저 - 무효 첨부 된() 예약 된 메서드 또는 방금 거기에 직접 새 정의? 또한 super.attached()에 대한 호출이 차단 되었습니까? –

+1

'attached'는'PoylmerElement'에 구현 된 메소드로 모든 초기화가 끝난 후 Polymer에 의해 호출됩니다. 요소의이 메소드를 오버라이드 (override) 해,'attached' 메소드의 커스텀 구현을 제공 할 수 있습니다. 그러한 메소드를 오버라이드 (override)하는 경우,'super.attached()'를 호출 해, 디폴트의 구현을 실행할 필요가 있습니다. 'super.attached()'를 호출하지 않으면 요소가 첨부되지 않습니다. 나는 당신이 '차단 (blocking)'을 의미하는지 모르겠습니다. 동기식으로 실행됩니다. 위의 예제에서'print'는'super.attached()'가 리턴 한 후에 실행됩니다. –

+1

'@ override' 주석을 추가하여 첨부 된 내용을보다 명확하게 보여줍니다. –