2015-07-28 27 views
6

Chcę utworzyć komponent do zawijania zdarzeń z interfejsu API opuść HTML5 przeciągnij &. To pierwszy komponent, który zrobiłem w Emberu, więc bądź przy mnie. Wstępnie kompilujemy szablony do Templates.js i Components.js. Używamy HTMLBars do szablonów. Szukałem w oficjalnych docs Ember i kilka tutoriali na składniki Ember ale nadal mówi:Nie znaleziono komponentu Ember

Uncaught Error: Assertion Failed: A helper named 'dropzone' could not be found 

Jest to kod Javascript dla komponentu w JS/Components/dropzone.js:

App.DropzoneComponent = Ember.Component.extend({ 
    classNames: ['dropzone'], 
    classNameBindings: ['dragClass'], 
    dragClass: 'deactivated', 
    type: null, 

    dragLeave(event) { 
     if (get(this, 'type') != null) { 
      event.preventDefault(); 
      set(this, 'dragClass', 'deactivated'); 
     } 
    }, 

    dragOver(event) { 
     if (get(this, 'type') != null) { 
      event.preventDefault(); 
      set(this, 'dragClass', 'activated'); 
     } 
    }, 

    drop(event) { 
     if (get(this, 'type') != null) { 
      var data = event.dataTransfer.getData('text/data'); 
      this.sendAction('dropped', type, data); 

      set(this, 'dragClass', 'deactivated'); 
     } 
    } 
}); 

Jest to komponent Handlebars/Components/dropzone.hbs szablon:

{{yield}} 

Jest to bardzo proste, ponieważ powinno zawijać tylko niektóre inne elementy HTML. I wyślij o akcję dropped na kontrolerze, gdy plik lub przedmiot został upuszczony w jego strefie.

ten sposób kompilator szablon skompilował Handlebars/Components/dropzone.hbs szablonu:

Ember.TEMPLATES["components/dropzone"] = Ember.HTMLBars.template((function() { 
    return { 
    meta: { 
     "revision": "[email protected]+4eb55108", 
     "loc": { 
     "source": null, 
     "start": { 
      "line": 1, 
      "column": 0 
     }, 
     "end": { 
      "line": 1, 
      "column": 9 
     } 
     } 
    }, 
    arity: 0, 
    cachedFragment: null, 
    hasRendered: false, 
    buildFragment: function buildFragment(dom) { 
     var el0 = dom.createDocumentFragment(); 
     var el1 = dom.createComment(""); 
     dom.appendChild(el0, el1); 
     return el0; 
    }, 
    buildRenderNodes: function buildRenderNodes(dom, fragment, contextualElement) { 
     var morphs = new Array(1); 
     morphs[0] = dom.createMorphAt(fragment,0,0,contextualElement); 
     dom.insertBoundary(fragment, 0); 
     dom.insertBoundary(fragment, null); 
     return morphs; 
    }, 
    statements: [ 
     ["content","yield",["loc",[null,[1,0],[1,9]]]] 
    ], 
    locals: [], 
    templates: [] 
    }; 
}())); 

ten sposób I wdrożone komponentu w głównym szablonie:

{{#dropzone type="cover"}} 
     <img title="Cover picture" alt="Cover picture" {{bind-attr src=data.cover}} class="cover-picture" /> 
{{/dropzone}} 

Z rzeczy, które przeczytałem w docs Ember i tutoriale I googled wszystko powinno być w porządku.

+0

Out zainteresowania czy za dasherizing swój składnik? Zgodnie z dokumentami emberjs składniki powinny zostać poddane dasherized, aby uniknąć kolizji z innymi potencjalnymi tagami. – David

+0

Dziwne, że to wystarczyło. Zmieniając 'dropzone' na' drop-zone' komponent zaczął działać idealnie. Dziękuję, jeśli utworzysz odpowiedź, zaakceptuję to! – Feanaro

+0

To nie jest "dziwne"; składniki muszą być oznaczone w ten sposób! Powinien pojawić się błąd w konsoli informujący, że nazwa komponentu jest błędna i że musisz dodać myślnik. – alexlafroscia

Odpowiedz

14

To jest kontynuacja mojego komentarza powyżej. Zgodnie z dokumentacją EmberJS stwierdza:

Uwaga: Komponenty muszą mieć co najmniej jedną kreskę w nazwie. Więc blog-post jest dopuszczalne nazwisko, więc jest audio-player-kontrolne, ale post jest nie

referencyjny: Defining Components

+1

Dzięki. To było naprawdę zaskakujące i moment "wtf" – kizzx2

Powiązane problemy