2015-03-30 3 views
4

Я хочу добавить пользовательскую запись в контекстное меню приложения Vexi.Как добавить настраиваемое контекстное меню в текстовое поле в Vexi?

Я попытался добавить contextActions функцию, но он выдает ошибку:

<textarea> 
    thisbox.contextmenu.contextActions = function() { 
     return [{ 
      text: "Foo", 
      action: function(v) { cascade = v; vexi.log.info("foo"); }, 
      enabled: enabled 
     }]); 
    } 
</textarea> 

Как это сделать?

+6

Обсуждено на [meta] (http://meta.stackoverflow.com/questions/309359/how -в-таг-ан-непомеченный-вопрос-использование-а-редкой-технологии). – pnuts

ответ

3

Чтобы расширить существующую реализацию контекстного меню в текстовом поле многоразового образом, создать шаблон, который preapplies vexi.widget.textarea и положить прочитать ловушки на contextActions собственности. Мы можем использовать cascade, чтобы вызвать чтение из этого свойства - то есть вызвать существующую реализацию - которая возвращает массив. Мы просто добавить к этому массиву:

<vexi xmlns="vexi.widget"> 
    <textarea> 
     // overlays the trap specified in the inherited 
     // org.vexi.lib.text.contextmenu by textarea 
     thisbox.contextActions ++= function() { 
      var actions = cascade; 
      actions.push(
      new .menuitem({ 
       text: "Foo", 
       action: function(v) { cascade = v; vexi.log.info("foo"); }, 
       enabled: enabled 
      })); 
      return actions; 
     } 
    </textarea> 
</vexi> 

фон

Ключ к расширению существующего TextArea является понимание того, как Traps и как <textarea> виджет наследует через preapplied шаблоны (и шаблонов они preapply, и т.д.) , Вы можете пройти через иерархию виджетов, начиная с src/vexi/widget/textarea.t, затем просматривая соответствующие предварительные примеры. Вы, в конце концов, увидите, что org.vexi.lib.widget.textarea preapplies org.vexi.lib.text.contextmenu, и там мы можем увидеть реализацию контекстного меню по умолчанию с копией/вырезанием/вставкой и т. Д.

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