Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2013-09-26

dijit

It were not best that we should all think alike; it is
difference of opinion that makes horse races.
Pudd'nhead Wilson's Calendar

Dojo, dijit, widget — странные слова и странная библиотека. Но, как бы то ни было, ArcGIS Javascript API предполагает использование этих инструментов. А инструменты эти очень непросто осваивать, в силу их масштабности и слабой распространенности. Не хватает документации и примеров. Поэтому здесь я оставлю шаблон виджета в стиле dijit.

Допустим, виджет будет называться «agsdir» и его файлы будут базироваться в папке
javascript\vs\dijit\
внутри вебприложения.

Тогда скрипт будет называться agsdir.js:
define("vs/dijit/agsdir",
    ['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_Templated',
        'dojo/_base/array', "dojo/dom-construct", "dijit/_TemplatedMixin",
        "dijit/layout/ContentPane", "dijit/layout/LayoutContainer", "dijit/form/ValidationTextBox",
        "dijit/_WidgetsInTemplateMixin",
        "dojo/text!./templates/agsdir.html"
    ],
    function(declare, _WidgetBase, _Templated,
        array, domConstruct, _TemplatedMixin,
        ContentPane, LayoutContainer, ValidationTextBox,
        _WidgetsInTemplateMixin,
        dirTemplate) {

        var AGSDIR = declare("vs.dijit.agsdir", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {

constructor: function(params, srcNodeRef) {
    params = params || {};
    if (!params.map) {
        throw new Error('no map defined in params for AGSDIR');
    }
    dojo.mixin(this, params);
},

templateString: dirTemplate,
baseClass: "layersAGSDir",

buildRendering: function() {
    this.inherited(arguments);
},

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

startup: function() {
    this.inherited(arguments);
    var frm = dijit.byId('agsdirURLform');
    frm.on("submit", dojo.hitch(this, function() {
        try {
            var val = dijit.byId('agsdirURLtb').get('value').trim();
            this.processUI(val);
        } catch(ex) {
            this.log('agsdirURLform on submit, error: ' + ex.message + ex. description + ex.stack);
        }
        return false;
    }));
    dojo.byId('agsdirURLtb').focus();
}
        }); // declare AGSDIR

return AGSDIR;
}); // define("vs/dijit/agsdir"
Внутри функции «startup» вызывается метод «processUI». Не ищите в этом примере реализацию этого метода, напишите его сами — он должен делать полезную работу. Имеющую прикладной смысл.

Как нетрудно заметить, скрипту нужен шаблон формы templates/agsdir.html:
<div id="agsDirLayoutContainer" data-dojo-type="dijit/layout/LayoutContainer" data-dojo-props="design:'headline'">
    <div id="agsDirTopPane" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'top'">
<!-- текстовое поле "URL-адрес |cgis.allgis.org (arcgis/rest/services)       |" -->
        <table cellpadding="0" cellspacing="0"><tbody>
            <tr>
                <td><label>URL-адрес:</label></td>
                <td>&nbsp;</td>
                <td colspan="2">
                <div id="agsdirURLform" data-dojo-type="dijit/form/Form">
                    <script type="dojo/on" data-dojo-event="submit">
                        console.log('agsdirURLform.submit');
                        return false;
                    </script>
                    <input name="agsdirURLtb" id="agsdirURLtb" type="text" required="true"
                        value="cgis.allgis.org"
                        data-dojo-type="dijit/form/ValidationTextBox"
                        data-dojo-props="regExp:'[^\\s]+',
                            invalidMessage:'http://cgis.allgis.org/arcgis/rest/services',
                            promptMessage:'cgis.allgis.org/arcgis/rest/services',
                            missingMessage:'http://cgis.allgis.org',
                            placeHolder:'http://server/arcgis/rest/services'" />
                    <button id="agsdirURLsubmit"
                        data-dojo-type="dijit/form/Button"
                        data-dojo-props="iconClass:'dijitEditorIcon dijitEditorIconPaste', showLabel: false"
                        type="submit">
                        Go
                    </button>
                </div> <!-- form -->
                </td>
            </tr>
        </tbody></table>
    </div> <!-- agsDirTopPane -->
</div>
CSS рассматривать не будем, эти вопросы решаются вполне традиционно.

С виджетом понятно. А как его создать, внедрить в страницу?
Где-то в файле index.html, перед подключением dojo:
<script type="text/javascript">
var path_location = location.pathname.replace(/\/[^/]+$/, '');
var dojoConfig = {
  parseOnLoad: true,
  packages: [{
    name: "utilities",
    location: path_location + '/javascript'
  }, {
    name: "vs",
    location: path_location + '/javascript/vs'
  }]
};
</script>
Что дает нам неймспейсы «vs» и «utilities».

Далее, где-то в скрипте приложения, по событию нажатия на кнопку, допустим, пишем код создания экземпляра виджета:
require(["vs/dijit/agsdir"], function(agsdir) {
    var agsdirDijit = dijit.byId('agsdirDijit');
    if(agsdirDijit) { ; }
    else {
        agsdirDijit = new agsdir({
            id    : 'agsdirDijit',
            map   : map
        });
        dojo.byId('agsdirPanel').appendChild(agsdirDijit.domNode);
    }

    if (dojo.isIE === 8) {
        setTimeout(function () {
            agsdirDijit.startup();
        }, 100);
    } else {
        agsdirDijit.startup();
    }
});
Как несложно заметить, где-то в HTML должен быть элемент с id='agsdirPanel', предназначенный для всобачивания в него созданный виджет.

Как-то так.




original post http://vasnake.blogspot.com/2013/09/dijit.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)