2013-07-10 3 views
2

Я пытаюсь сделать что-то похожее на this question, но используя OnDemandList вместо OnDemandGrid.Виджеты внутри Dojo dgrid OnDemandList

Вот то, что я до сих пор

define([ 
    "dojo/_base/declare", 
    "dijit/_WidgetBase", 
    "dijit/_TemplatedMixin", 
    "dijit/_WidgetsInTemplateMixin", 
    "dgrid/OnDemandList", 
    "widget/CategoryItem", 
    "dojo/dom-construct", 
    "dojo/text!./templates/category-list.html" 
], function(declare, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, OnDemandList, CategoryItem, domConstruct, template) { 
    var CatList = declare([OnDemandList]); 
    return declare([_Widget, _TemplatedMixin, _WidgetsInTemplateMixin], { 
     templateString: template, 
     baseClass: "category-list", 

     postCreate: function() { 
      this.inherited(arguments); 

      // Create OnDemandList, place in div defined in template. 
      var cat1 = this.cat1 = new CatList({ 
       store: this.store, 
       renderRow: this.renderItem 
      }, this.categoriesLevel0); 

     }, 

     renderItem: function(item) { 
      return new CategoryItem({ 
       title: item.title 
      }); 
     } 
    }); 
}); 

Проблема является моя функция renderItems должна каким-то образом вернуть РОМ, содержащий мой собственный виджет. Как сейчас, я получаю эту ошибку Error on domReady callback: Error: NotFoundError: DOM Exception 8

ответ

2

Да, определенно нужно вернуть узел dom из renderRow. Предполагая, что вы используете _WidgetBase для CategoryItem он должен работать как:

renderItem: function(item) { 
    var category = new CategoryItem({ 
     title: item.title 
    }); 
    return category.domNode; 
} 

Пример здесь: https://github.com/SitePen/dgrid/wiki/OnDemandList-and-OnDemandGrid делает почти то же самое, за исключением того, что использует положить переключатель, который только, строящий DIV, приложив виджет это и возвращение нового div.

+1

Очевидный вопрос: это виджет CategoryItem, который вы создаете когда-либо уничтоженным? Вы возвращаете узел DOM, который может быть очищен dgrid, уничтожая строку, но обычно объект Javascript, являющийся экземпляром dijit, уничтожается только путем вызова destroy() на нем. Обновление: нашел ответ на мой собственный вопрос: https://github.com/SitePen/dgrid/blob/master/doc/usage/Working-with-Widgets.md - по существу, подключиться к 'removeRow' на dgrid и вызовите destroyRecursive на cellElement.widget. Простой подход, показанный выше, содержит опасную утечку памяти. – Neek

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