2015-05-18 18 views
14

Sto tentando di creare un elemento personalizzato da polymer-element, ma non riesco a rendere operativo il @CustomTag. Il mio dart del file (my_element.dart) si presenta così:Importazione HTML: CustomTag non registrato

@HtmlImport('my_element.html') 
library projects.projectFolder.layout; 

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

@CustomTag('my-element') 
class MyElement extends PolymerElement { 

    @published String caption; 
    MyElement.created() : super.created(); 
} 

Il mio file html (my_element.html) si presenta così:

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

<polymer-element name="my-element"> 
    <template> 
    <link rel="stylesheet" href="my_element.css"> 

    <core-toolbar> 
     <h1>{{ caption }}</h1> 
    </core-toolbar> 

    </template> 
    <script type="application/dart" src="../my_element.dart"></script> 
</polymer-element> 

Il fatto è che la console Chrome continua a stampare il seguente errore:

No elements registered in a while, but still waiting on 1 elements to be registered. Check that you have a class with an @CustomTag annotation for each of the following tags: 'my-element'. 

È curioso, perché ho dichiarato il tag personalizzato come dovrebbe essere. Sembra che non abbia letto il file .dart quando raggiunge lo .html.
Il file .html viene chiamato da un altro file principale .html. Penso che l'ordine in cui vengono chiamati i file potrebbe essere il problema, ma poi di nuovo se Dart è compilato prima dell'esecuzione, non dovrebbe importare.
Ho provato diverse soluzioni ma nessuna ha funzionato. L'unico che ha funzionato è piuttosto sporco, che sta importando il file my_element.dart direttamente dal file principale my_app.dart. Immagino che non dovrebbe essere fatto in quel modo perché significherebbe importare ogni singolo file my_element.dart nello stesso main my_app.dart.

EDIT (aggiungere index.html, pubspec.yml)
Il mio file index.html si presenta come segue:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> 
    <title>My app</title> 
</head> 
<body unresolved fullbleed> 
    <my-app></my-app> 

    <script type="application/dart"> 
    import 'package:polymer/polymer.dart'; 
    import 'package:project/my_app.dart'; 

    main() => initPolymer(); 

    </script> 
</body> 
</html> 

my_app è un altro elemento su misura, che è l'elemento principale, dove tutti gli altri vanno. In altre parole, è come il controller principale per l'app. Questo elemento ha anche un file .dart e .html, che chiamerà altri elementi come my-element.
Come potete vedere, la mia funzione main() è molto semplice, poiché inizia solo Polimero (vedere index.html).

mio pubspec.yml assomiglia seguente:

name: project 
version: 0.0.1 
description: Some project. 
author: Tomas 
homepage: https://github.com/******* 

environment: 
    sdk: '>=1.10.0 <2.0.0' 

dependencies: 
    polymer: '^0.16.0' 
    core_elements: '^0.7.1' 
    paper_elements: '^0.7.1' 
    route_hierarchical: "^0.6.1" 

transformers: 
- polymer: 
    entry_points: web/index.html 
- $dart2js: 
    $include: "**/*.polymer.bootstrap.dart" 

mia directory assomiglia a questo (ho appena mostrano una frazione di esso, l'importante spero):

. 
├── README.md 
├── build 
│   └── web 
│    ├── index.html 
│    ├── index.html.polymer.bootstrap.dart.js 
│    └── packages 
├── lib 
│   ├── my_app.dart 
│   └── src 
│    ├── elements 
│    ├── layout 
│    │   ├── my_element.css 
│    │   ├── my_element.dart 
│    │   └── my_element.html 
│    ├── my_app.css 
│    ├── my_app.html 
│    └── modules 
│     └── module.dart 
│    ├── my_app.css 
├── pubspec.lock 
├── pubspec.yaml 
└── web 
│ ├── index.html 
│ └── packages -> ../packages 
│    ├── my_app.html 
│    └── modules 
│     └── module.dart 

Spero che questa modifica non confonde più di quanto dovrebbe Sto solo cercando di sapere qual è la corretta struttura delle cartelle e la forma di importazione di un'app Dart.

In breve: come dovrebbe apparire l'albero quando si programma una grande applicazione in freccette e dove dovrei fare le importazioni? Ho esaminato tutta la documentazione che potevo, inclusi alcuni tutorial, ma tutti parlano di esempi molto semplici in cui la maggior parte del codice si trova nella cartella web, che non vorrei.

EDIT (riassumere e riformulare, aggiungere my_app.html e my_app.dart)

In poche parole:

Ho un elemento personalizzato definito da my_element.html e my_element.dart (sopra definita in questa risposta) e voglio per importarlo in un altro elemento my_app utilizzando solo l'html. Cioè non importando my_element.dart in my_app.dart, ma da solo importando my_element.html utilizzando un tag link in my_app.html:

<link rel="import" href="../../../packages/polymer/polymer.html"> 
<link rel="import" href="layout/my_element.html"> 

<polymer-element name="my-app"> 
    <template> 

    <core-scaffold id="scaffold"> 

     <my-element tool flex></my-element> 

     <main fit></main> 

    </core-scaffold> 

    </template> 
    <script type="application/dart" src="../my_app.dart"></script> 
</polymer-element> 

my_app.dart:

@HtmlImport('src/my_app.html') 

import 'package:polymer/polymer.dart'; 
import 'package:core_elements/core_scaffold.dart'; 

@CustomTag('my-app') 
class MyApp extends PolymerElement { 

    MyApp.created() : super.created(); 
} 

non il <script type="application/dart" src="../my_element.dart"></script> dovrebbe essere sufficiente per dire al compilatore di caricare il dardo file per la registrazione del tag dell'elemento seguendo la dipendenza transitiva definita dall'importazione HTML?

+0

Come funziona l'indice 'main()', '. html', e 'pubspec.yaml' assomiglia? In quale directory ci sono i tuoi file di elementi? –

+1

Ho appena fatto una modifica alla domanda in cui mostro le informazioni richieste. Grazie per l'aiuto :). – tomasyany

+0

Giusto per confermare, il tuo file 'my_app.dart' importa il tuo file' my_element.dart'? –

risposta

0

È necessario importare tutte le classi Dart del componente personalizzato nel proprio my_app.dart. Generalmente, devi creare un singolo file Dart da importare, che esporrebbe ogni voce in modo che il tuo my_app.dart rimanga pulito.