Вопрос по javascript, dojo, static, declare – додзё объявляет правильный путь

1

файл:dojo/dir1/utils/XmlJsonUtils.js

// Author: Rajat Khandelwal

define([
    "dojo/_base/declare" // declare
    ], function(declare){
      return declare("dir1.utils.XmlJsonUtils",[],{
        parseXml : function (xml) {
                     var self=this;
                     var dom = null;
                     if (window.DOMParser) {
                       try { 
                         dom = (new DOMParser()).parseFromString(xml, "text/xml"); 
                       } 
                       catch (e) { dom = null; }
                     }
                     else if (window.ActiveXObject) {
                       try {
                         dom = new ActiveXObject('Microsoft.XMLDOM');
                         dom.async = false;
                         if (!dom.loadXML(xml)) // parse error ..

        window.alert(dom.parseError.reason + dom.parseError.srcText);
                       } 
                       catch (e) { dom = null; }
                     }
                     else
                       alert("cannot parse xml string!");
                     return dom;
                   },
                 xml2json  : function (xmldata)
                 {
                   var self=this;
                   if(xmldata.firstChild==null)
                   {
                     return {name:xmldata.nodeName+": (value null)", checked: true}
                   }
                   else if(xmldata.firstChild.nodeType==3)
                   {
                     return {name:xmldata.nodeName+": "+xmldata.firstChild.nodeValue, checked:true}
                   }
                   else
                   {
                     var mychildren=[];
                     var i=0;
                     var nochildren=xmldata.childElementCount
                       for(i=0;i<nochildren;i++)
                       {
                         var j=self.xml2json(xmldata.childNodes[i])
                           mychildren[i]=j
                       }
                     var ret= {name:xmldata.nodeName, children:mychildren, checked:true}
                     return ret
                   }
                 },

                 convert2arr : function (result,ctr,res_arr)
                 {
                   var self=this;
                   if(result[ctr].checked[0]==false)
                     return;
                   if(result[ctr].children==undefined)
                   {
                     var name=result[ctr]['name'][0];
                     var kv = name.split(': ');
                     if(kv[1]=="(value null)")
                       kv[1]="";
                     res_arr.push.apply(res_arr,["<",kv[0],">",kv[1],"</",kv[0],">"]);
                     return ctr+1;
                   }
                   else
                   {
                     var i=ctr;
                     var new_ctr=ctr;
                     var no_children=result[ctr].children.length;
                     res_arr.push.apply(res_arr,["<",result[ctr].name[0],">"])
                       for(i=0;i<no_children;i++)
                       {
                         new_ctr=self.convert2arr(result,result[ctr].children[i]._0,res_arr)
                       }
                     res_arr.push.apply(res_arr,["</",result[ctr].name[0],">"]);
                     return new_ctr;
                   }
                 },
                 convert2xml : function (result)
                 {
                   var arr=[]
                     self.convert2arr(result, 0, arr)
                     return arr.join('')
                 }
      })
    })

но когда в коде яrequire dir1.utils.XmlJsonUtilsэто говоритUncaught Error: declare XmlJsonUtils: base class is not a callable constructor, Как правильно объявить некоторые служебные функции.

И это должно быть как статические функции. Я не хочу делатьx=new XmlJsonUtils(); x.parseXml(..), я хочу делатьXmlJsonUtils.parseXml(..)

Ваш Ответ

2   ответа
2

В вашем классе не должно быть определенного метода конструктора, dojo.declare должен это обрабатывать. Однако, это не повредит, просто определите пробелconstructor: function() { }, Я подозреваю, что вы столкнулись с какой-то ошибкой.

Определение такое, как должно быть, «определение»; используется для require-scope, когда выполняется require ([& quot; my.module & quot;]), ожидается, что он будет иметьdefine метод, который возвращает базовый класс черезdeclare.

файл:dojo/dir1/utils/XmlJsonUtils.js:

define([
   // requirements
   "dojo/_base/declare", 
   "dir1/utils/Toolkit" // sample in-package dependency
   "./Toolkit"     // Same as Above
], function (declare) {
   // no slash separator, use dot with declare, 
   // use a reference and return on last line
   var Klass = declare(
   /// declaredClass: string, moduleUrl with dot-separater + filename /.js//
       "dir1.utils.XmlJsonUtils",
   /// base class: Array(mixins)
       [],
   /// class scope
       {
           _methodMeantToBePrivate: function() { },
           randomInstanceMethod: function() { }
       }
   ); // end declare


   // set any aliases, which you want to expose (statics)

   Klass.StaticCallable = function() {
       // careful with your scope access inhere
   }

   // return the declared class to 'define'
   return Klass;
}); // end define

Таким образом (у вас должна быть ссылка, указанная с помощью require или getObject), вы можете использоватьStaticCallable Функция без инициализации / создания экземпляра модуля. AMD совместимый синтаксис выглядит так:

require(["dir1/utils/XmlJsonUtils"], function(xmlUtils) {
   xmlUtils.StaticCallable();
});

или если ранее требовалось

var xmlUtils = dojo.getObject("dir1.utils.XmlJsonUtils")
xmlUtils.StaticCallable();

Конкретным примером может быть универсальный класс, подобный следующему, где возможен как экземпляр, так и статический доступ. Базовый класс определяет «инструменты», производный класс определяет переменные «инструменты»; работать - и, если он создан, темы по умолчанию могут быть подписаны - [MessageBusBase | MessageBus ]

Это не будет проблемой, однако у вас часто есть инициализация виджета после того, как он создан. Это не тот случай, если вы устанавливаете статическую функцию, вы также должны обращаться к переменным класса статически (в то время как этот контекст «запрещен»); ). Я добавил ссылки на образец старой CMS, которую я сделал в додзе некоторое время назад
require(["dojo/dir1/utils/XmlJsonUtils"], function(util) { util.parseXml() }); работает..Klass Только внутренняя переменная - внутри define (function () {scope }). see last two code blocks in answer : D
не могли бы вы подробнее рассказать оcareful with your scope access in here? например, я определяю рекурсивную функцию, поэтому я должен ссылаться на себя. prongs
так что вы предлагаете мне назвать это какKlass.parseXml, Но где яrequire это, я не имеюKlass определены, так что не будет ли это ошибкой? prongs
0

Вопрос: в вашем коде.

return declare("dir1.utils.XmlJsonUtils",[],{
    parseXml : function (xml) {

Вместоdir1.utils.XmlJsonUtils использованиеdir1/utils/XmlJsonUtilsто есть, используйте косую черту вместо точек в объявлении вашей функции.

Похожие вопросы