2016-08-01 21 views
0

Ich habe Probleme, ein benutzerdefiniertes Widget zu erhalten (erbt von _WidgetBase, _TemplatedMixin, & _FocusMixin), um ordnungsgemäß als Editor-Widget mit Dgrid zu funktionieren.Wie fokussiere ich ein benutzerdefiniertes Editor-Widget mit dgrid?

Insbesondere habe ich Probleme, den Fokus zwischen den Spalten zu verwalten. Wenn ich ein Widget in einer Spalte bearbeite und versuche, in eine andere Spalte zu wechseln, wird das Editor-Widget in der neuen Spalte nicht fokussiert.
Hier ist eine abgespeckte Beispiel:

console.clear(); 
 

 
require({ 
 
    packages: [ 
 
    { 
 
     name: 'dgrid', 
 
     location: '//cdn.rawgit.com/SitePen/dgrid/v1.1.0' 
 
    }, 
 
    { 
 
     name: 'dstore', 
 
     location: '//cdn.rawgit.com/SitePen/dstore/v1.1.1' 
 
    } 
 
    ] 
 
}, [ 
 
    'dojo/_base/declare', 
 
    'dojo/keys', 
 
    'dojo/on', 
 
    
 
    'dgrid/Editor', 
 
    'dgrid/Keyboard', 
 
    'dgrid/OnDemandGrid', 
 
    'dgrid/Selection', 
 
    
 
    'dijit/_WidgetBase', 
 
    'dijit/_TemplatedMixin', 
 
    'dijit/_FocusMixin', 
 
    
 
    'dstore/Memory', 
 
    'dstore/Trackable', 
 
    
 
    'dojo/domReady!' 
 
], function (
 
    declare, 
 
    keys, 
 
    on, 
 
    
 
    Editor, 
 
    Keyboard, 
 
    OnDemandGrid, 
 
    Selection, 
 
    
 
    _WidgetBase, 
 
    _TemplatedMixin, 
 
    _FocusMixin, 
 
    
 
    Memory, 
 
    Trackable 
 
) { 
 
    var EditWidget = declare([_WidgetBase, _TemplatedMixin, _FocusMixin], { 
 
    templateString: '<div><input data-dojo-attach-point="textBox" type="text"></div>', 
 
    focus: function() { 
 
     this.textBox.focus(); 
 
    }, 
 
    _getValueAttr: function() { 
 
     return this.textBox.value; 
 
    }, 
 
    _setValueAttr: function (newValue) { 
 
     this.textBox.value = newValue; 
 
    }, 
 
    postCreate: function() { 
 
     var that = this; 
 
     
 
     on(this.textBox, 'blur', function() { 
 
     that.emit('blur'); 
 
     }); 
 
     
 
     this.inherited(arguments); 
 
    } 
 
    }); 
 
    
 
    
 
    var grid = new (declare([OnDemandGrid, Keyboard, Selection, Editor]))({ 
 
    selectionMode: 'single', 
 
    noDataMessage: 'no data', 
 
    columns: [{field: 'ID', sortable: false}, { 
 
     autoSave: true, 
 
     field: 'LENGTH', 
 
     editor: EditWidget, 
 
     sortable: false, 
 
     editOn: 'dgrid-cellfocusin' 
 
    }, { 
 
     autoSave: true, 
 
     field: 'WEIGHT', 
 
     editor: EditWidget, 
 
     sortable: false, 
 
     editOn: 'dgrid-cellfocusin' 
 
    }, { 
 
     autoSave: true, 
 
     field: 'HEIGHT', 
 
     editor: EditWidget, 
 
     sortable: false, 
 
     editOn: 'dgrid-cellfocusin' 
 
    }], 
 
    deselectOnRefresh: false 
 
    }, document.getElementById('gridDiv')); 
 
    
 
    var store = new (declare([Trackable, Memory]))({ 
 
     data: [{ID: 1, LENGTH: '', WEIGHT: '', HEIGHT: ''}, 
 
      {ID: 2, LENGTH: '', WEIGHT: '', HEIGHT: ''}, 
 
      {ID: 3, LENGTH: '', WEIGHT: '', HEIGHT: ''}], 
 
     idProperty: 'ID' 
 
    }); 
 

 
    grid.set('collection', store); 
 
    grid.startup(); 
 
    
 
    var onGridKeydown = function (e) { 
 
    var modifierKeys = [ 
 
     keys.TAB, 
 
     keys.LEFT_ARROW, 
 
     keys.UP_ARROW, 
 
     keys.RIGHT_ARROW, 
 
     keys.DOWN_ARROW 
 
    ]; 
 

 
    var advance = function() { 
 
     Keyboard.moveFocusRight.call(grid, e); 
 
    }; 
 
    var retreat = function() { 
 
     Keyboard.moveFocusLeft.call(grid, e); 
 
    }; 
 

 
    if (modifierKeys.indexOf(e.keyCode) !== -1) { 
 
     switch (e.keyCode) { 
 
      case keys.TAB: 
 
       if (!e.shiftKey) { 
 
        advance(); 
 
       } else { 
 
        retreat(); 
 
       } 
 
       break; 
 
      case keys.LEFT_ARROW: 
 
       retreat(); 
 
       break; 
 
      case keys.RIGHT_ARROW: 
 
       advance(); 
 
       break; 
 
      case keys.UP_ARROW: 
 
       Keyboard.moveFocusUp.call(grid, e); 
 
       break; 
 
      case keys.DOWN_ARROW: 
 
       Keyboard.moveFocusDown.call(grid, e); 
 
       break; 
 
     } 
 
    }  
 
    }; 
 
    
 
    grid.on('keydown', onGridKeydown); 
 
});
.dgrid { 
 
    height: 300px; 
 
} 
 
.dgrid-row { 
 
    height: 25px; 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width"> 
 
    <title>Custom dgrid editor widget</title> 
 
    <script src="//ajax.googleapis.com/ajax/libs/dojo/1.11.2/dojo/dojo.js"></script> 
 
    <link rel="stylesheet" href="//cdn.rawgit.com/SitePen/dgrid/v1.1.0/css/dgrid.css"> 
 
</head> 
 
<body> 
 
    <p>Click in a cell in the "LENGTH" column and type in a character. Then hit "TAB". Why doesn't the next cell's textbox focus?</p> 
 
    <div id='gridDiv'></div> 
 
</body> 
 
</html>

Dank im Voraus für jede Beratung.

+0

Wenn das Sie haben ein Problem, müssen Sie nach Ihrem fragen anders ausstellen. Während ich froh bin, jemanden zu sehen, der die Dokumentation lesen möchte, ist die Abfrage von Offsite-Ressourcen off-topic: Fragen, die uns auffordern, ** ein Buch, ein Tool, eine Softwarebibliothek, ein Tutorial oder eine andere Offsite-Ressource zu empfehlen oder zu finden, sind deaktiviert -Topic ** für Stack Overflow, da sie dazu neigen, eigensinnige Antworten und Spam zu bekommen. Beschreiben Sie stattdessen das Problem und was bisher unternommen wurde, um es zu lösen. – Makyen

Antwort

0

Das einzige fehlende Teil ist eine startup Methode für Ihr Editor Widget.
(Die startup Methode ist Teil der Dojo-Widgets' Lebenszyklus)

console.clear(); 
 

 
require({ 
 
    packages: [ 
 
    { 
 
     name: 'dgrid', 
 
     location: '//cdn.rawgit.com/SitePen/dgrid/v1.1.0' 
 
    }, 
 
    { 
 
     name: 'dstore', 
 
     location: '//cdn.rawgit.com/SitePen/dstore/v1.1.1' 
 
    } 
 
    ] 
 
}, [ 
 
    'dojo/_base/declare', 
 
    'dojo/keys', 
 
    'dojo/on', 
 
    
 
    'dgrid/Editor', 
 
    'dgrid/Keyboard', 
 
    'dgrid/OnDemandGrid', 
 
    'dgrid/Selection', 
 
    
 
    'dijit/_WidgetBase', 
 
    'dijit/_TemplatedMixin', 
 
    'dijit/_FocusMixin', 
 
    
 
    'dstore/Memory', 
 
    'dstore/Trackable', 
 
    
 
    'dojo/domReady!' 
 
], function (
 
    declare, 
 
    keys, 
 
    on, 
 
    
 
    Editor, 
 
    Keyboard, 
 
    OnDemandGrid, 
 
    Selection, 
 
    
 
    _WidgetBase, 
 
    _TemplatedMixin, 
 
    _FocusMixin, 
 
    
 
    Memory, 
 
    Trackable 
 
) { 
 
    var EditWidget = declare([_WidgetBase, _TemplatedMixin, _FocusMixin], { 
 
    templateString: '<div><input data-dojo-attach-point="textBox" type="text"></div>', 
 
    focus: function() { 
 
     this.textBox.focus(); 
 
    }, 
 
    _getValueAttr: function() { 
 
     return this.textBox.value; 
 
    }, 
 
    _setValueAttr: function (newValue) { 
 
     this.textBox.value = newValue; 
 
    }, 
 
    postCreate: function() { 
 
     var that = this; 
 
     
 
     on(this.textBox, 'blur', function() { 
 
     that.emit('blur'); 
 
     }); 
 
     
 
     this.inherited(arguments); 
 
    }, 
 
    startup: function() { 
 
     this.focus(); 
 
    } 
 
    }); 
 
    
 
    
 
    var grid = new (declare([OnDemandGrid, Keyboard, Selection, Editor]))({ 
 
    selectionMode: 'single', 
 
    noDataMessage: 'no data', 
 
    columns: [{field: 'ID', sortable: false}, { 
 
     autoSave: true, 
 
     field: 'LENGTH', 
 
     editor: EditWidget, 
 
     sortable: false, 
 
     editOn: 'dgrid-cellfocusin' 
 
    }, { 
 
     autoSave: true, 
 
     field: 'WEIGHT', 
 
     editor: EditWidget, 
 
     sortable: false, 
 
     editOn: 'dgrid-cellfocusin' 
 
    }, { 
 
     autoSave: true, 
 
     field: 'HEIGHT', 
 
     editor: EditWidget, 
 
     sortable: false, 
 
     editOn: 'dgrid-cellfocusin' 
 
    }], 
 
    deselectOnRefresh: false 
 
    }, document.getElementById('gridDiv')); 
 
    
 
    var store = new (declare([Trackable, Memory]))({ 
 
     data: [{ID: 1, LENGTH: '', WEIGHT: '', HEIGHT: ''}, 
 
      {ID: 2, LENGTH: '', WEIGHT: '', HEIGHT: ''}, 
 
      {ID: 3, LENGTH: '', WEIGHT: '', HEIGHT: ''}], 
 
     idProperty: 'ID' 
 
    }); 
 

 
    grid.set('collection', store); 
 
    grid.startup(); 
 
    
 
    var onGridKeydown = function (e) { 
 
    var modifierKeys = [ 
 
     keys.TAB, 
 
     keys.LEFT_ARROW, 
 
     keys.UP_ARROW, 
 
     keys.RIGHT_ARROW, 
 
     keys.DOWN_ARROW 
 
    ]; 
 

 
    var advance = function() { 
 
     Keyboard.moveFocusRight.call(grid, e); 
 
    }; 
 
    var retreat = function() { 
 
     Keyboard.moveFocusLeft.call(grid, e); 
 
    }; 
 

 
    if (modifierKeys.indexOf(e.keyCode) !== -1) { 
 
     switch (e.keyCode) { 
 
      case keys.TAB: 
 
       if (!e.shiftKey) { 
 
        advance(); 
 
       } else { 
 
        retreat(); 
 
       } 
 
       break; 
 
      case keys.LEFT_ARROW: 
 
       retreat(); 
 
       break; 
 
      case keys.RIGHT_ARROW: 
 
       advance(); 
 
       break; 
 
      case keys.UP_ARROW: 
 
       Keyboard.moveFocusUp.call(grid, e); 
 
       break; 
 
      case keys.DOWN_ARROW: 
 
       Keyboard.moveFocusDown.call(grid, e); 
 
       break; 
 
     } 
 
    }  
 
    }; 
 
    
 
    grid.on('keydown', onGridKeydown); 
 
});
.dgrid { 
 
    height: 300px; 
 
} 
 
.dgrid-row { 
 
    height: 25px; 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width"> 
 
    <title>Custom dgrid editor widget</title> 
 
    <script src="//ajax.googleapis.com/ajax/libs/dojo/1.11.2/dojo/dojo.js"></script> 
 
    <link rel="stylesheet" href="//cdn.rawgit.com/SitePen/dgrid/v1.1.0/css/dgrid.css"> 
 
</head> 
 
<body> 
 
    <p>Click in a cell in the "LENGTH" column and type in a character. Then hit "TAB".</p> 
 
    <div id='gridDiv'></div> 
 
</body> 
 
</html>

Mit einem einfachen Textfeld:

console.clear(); 
 

 
require({ 
 
    packages: [ 
 
    { 
 
     name: 'dgrid', 
 
     location: '//cdn.rawgit.com/SitePen/dgrid/v1.1.0' 
 
    }, 
 
    { 
 
     name: 'dstore', 
 
     location: '//cdn.rawgit.com/SitePen/dstore/v1.1.1' 
 
    } 
 
    ] 
 
}, [ 
 
    'dojo/_base/declare', 
 
    'dojo/keys', 
 
    'dojo/on', 
 
    
 
    'dgrid/Editor', 
 
    'dgrid/Keyboard', 
 
    'dgrid/OnDemandGrid', 
 
    'dgrid/Selection', 
 

 
    'dstore/Memory', 
 
    'dstore/Trackable', 
 
    
 
    'dojo/domReady!' 
 
], function (
 
    declare, 
 
    keys, 
 
    on, 
 
    
 
    Editor, 
 
    Keyboard, 
 
    OnDemandGrid, 
 
    Selection, 
 
    
 
    Memory, 
 
    Trackable 
 
) { 
 
    
 
    var grid = new (declare([OnDemandGrid, Keyboard, Selection, Editor]))({ 
 
    selectionMode: 'single', 
 
    noDataMessage: 'no data', 
 
    columns: [{field: 'ID', sortable: false}, { 
 
     autoSave: true, 
 
     field: 'LENGTH', 
 
     editor: 'text', 
 
     sortable: false, 
 
     editOn: 'focus' 
 
    }, { 
 
     autoSave: true, 
 
     field: 'WEIGHT', 
 
     editor: 'text', 
 
     sortable: false, 
 
     editOn: 'focus' 
 
    }, { 
 
     autoSave: true, 
 
     field: 'HEIGHT', 
 
     editor: 'text', 
 
     sortable: false, 
 
     editOn: 'focus' 
 
    }], 
 
    deselectOnRefresh: false 
 
    }, document.getElementById('gridDiv')); 
 
    
 
    var store = new (declare([Trackable, Memory]))({ 
 
     data: [{ID: 1, LENGTH: '', WEIGHT: '', HEIGHT: ''}, 
 
      {ID: 2, LENGTH: '', WEIGHT: '', HEIGHT: ''}, 
 
      {ID: 3, LENGTH: '', WEIGHT: '', HEIGHT: ''}], 
 
     idProperty: 'ID' 
 
    }); 
 

 
    grid.set('collection', store); 
 
    grid.startup(); 
 
    
 
    var onGridKeydown = function (e) { 
 
    var modifierKeys = [ 
 
     keys.TAB, 
 
     keys.LEFT_ARROW, 
 
     keys.UP_ARROW, 
 
     keys.RIGHT_ARROW, 
 
     keys.DOWN_ARROW 
 
    ]; 
 

 
    var advance = function() { 
 
     Keyboard.moveFocusRight.call(grid, e); 
 
    }; 
 
    var retreat = function() { 
 
     Keyboard.moveFocusLeft.call(grid, e); 
 
    }; 
 

 
    if (modifierKeys.indexOf(e.keyCode) !== -1) { 
 
     switch (e.keyCode) { 
 
      case keys.TAB: 
 
       if (!e.shiftKey) { 
 
        advance(); 
 
       } else { 
 
        retreat(); 
 
       } 
 
       break; 
 
      case keys.LEFT_ARROW: 
 
       retreat(); 
 
       break; 
 
      case keys.RIGHT_ARROW: 
 
       advance(); 
 
       break; 
 
      case keys.UP_ARROW: 
 
       Keyboard.moveFocusUp.call(grid, e); 
 
       break; 
 
      case keys.DOWN_ARROW: 
 
       Keyboard.moveFocusDown.call(grid, e); 
 
       break; 
 
     } 
 
    }  
 
    }; 
 
    
 
    grid.on('keydown', onGridKeydown); 
 
});
.dgrid { 
 
    height: 300px; 
 
} 
 
.dgrid-row { 
 
    height: 25px; 
 
}
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width"> 
 
    <title>Custom dgrid editor widget</title> 
 
    <script src="//ajax.googleapis.com/ajax/libs/dojo/1.11.2/dojo/dojo.js"></script> 
 
    <link rel="stylesheet" href="//cdn.rawgit.com/SitePen/dgrid/v1.1.0/css/dgrid.css"> 
 
</head> 
 
<body> 
 
    <p>Click in a cell in the "LENGTH" column and type in a character. Then hit "TAB".</p> 
 
    <div id='gridDiv'></div> 
 
</body> 
 
</html>

+0

Danke für den Tipp dazu. Es kehrt jedoch zu demselben Verhalten zurück, wenn ich ein normales Textfeld als Editor anstelle des Widgets verwende. 'Editor: 'Text''. Was muss ich ändern, wenn es kein benutzerdefiniertes Widget ist, mit dem die Fokussierung funktioniert? –

+0

@ScottDavis Ich habe die Antwort bearbeitet. Eigentlich kenne ich den Grund nicht, aber es scheint, dass die Verwendung von 'editOn: 'focus' anstelle von' editOn: 'dgrid-cellfocusin' das Problem behebt, wenn' editor:' text'' verwendet wird. – ben

+0

Huh. Das ist komisch. Also ich denke, dass [dieses Dokument] (https://github.com/SitePen/dgrid/blob/master/doc/components/mixins/Editor.md#recommendations-for-the-editon-property) falsch ist. Vielen Dank für die Hilfe! –