2015-07-28 6 views
6

Я хочу создать компонент для переноса событий из HTML5 drag & drop API. Это первый компонент, который я сделал в Ember, так что несите меня. Мы предварительно скомпилируем шаблоны в Templates.js и Components.js. Мы используем HTMLBars для шаблонов. Я посмотрел на официальном Пост документах и ​​некоторые учебники по компонентам Поста, но до сих пор он говорит:Компонент Ember не найден

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

Это Javascript код компонента в 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'); 
     } 
    } 
}); 

Это Handlebars/Components/dropzone.hbs компонента шаблон:

{{yield}} 

Это очень просто, потому что это должно только обернуть некоторые другие элементы html. И отправьте за действие dropped на контроллер, когда файл или элемент был выпадет в его зоне.

Это как шаблон компилятор составил Handlebars/Components/dropzone.hbs шаблон:

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: [] 
    }; 
}())); 

Это, как я реализовал компонент в основном шаблоне:

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

Из вещей, которые я читал в документации Поста и учебники I Googled все должно быть в порядке.

+0

Из интереса Вы рассмотрели dasherizing свой компонент? В соответствии с компонентами emberjs docs компоненты должны быть дешифрованы, чтобы избежать столкновения с другими потенциальными тегами. – David

+0

Как ни странно, что сделал трюк. Изменяя «dropzone» на «drop-zone», компонент начал работать отлично. Спасибо, если вы создадите ответ, я приму это! – Feanaro

+0

Это не «странно»; компоненты должны быть помечены таким образом! На консоли должна была быть ошибка, сообщающая вам, что вы неправильно назвали компонент и что вам нужно добавить тире. – alexlafroscia

ответ

14

Это продолжение моего комментария выше. Согласно документации EmberJS, в ней указывается:

Примечание. Компоненты должны иметь хотя бы одну тире в своем имени. Так блог-пост является приемлемым названием, так аудио-плеер-контроль, но пост не

Ссылка: Defining Components

+1

Спасибо. Это было действительно удивительно, и момент «wtf» – kizzx2

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