前言:上一章学习了 monaco 中创建自定义 dom 的另一种方法 changeViewZones
。这个方法接受一个回调函数作为参数,这个回调函数的参数上面拥有我们需要的方法 addZone
layoutZone
removeZone
,这几个方法都只能在 changeViewZones
内部执行。其中 addZone
方法需要接收一个 Zone 类型的对象,描述新创建的自定义 dom 的各种信息。
这一章学习的是一个创建”响应式变量“的方法,响应式是我自封的,感觉有点像,createContextKey
。在 example-interacting-with-the-editor-adding-a-command-to-an-editor-instance 示例里有使用到。
createContextKey
方法是用来创建变量的,这个变量的值可以在后续的操作中动态修改。
createContextKey<T extends ContextKeyValue = ContextKeyValue>(key: string, defaultValue: T): IContextKey<T>;
接收两个参数
参数一:字符串,表示变量的key值
参数二:默认值,数据类型可以是任何的数据类型
返回值是 IContextKey
export interface IContextKey<T extends ContextKeyValue = ContextKeyValue> {
set(value: T): void;
reset(): void;
get(): T | undefined;
}
set
方法设置值,reset
方法重置,回到原始的默认值,get
方法获取值
在使用 createContextKey
定义变量之后,依赖变量的操作就可以直接填变量的key,类似于数据绑定,变量后续再变化的话,依赖于变量的值也会自动变化。
在官网给的这个例子里面,是给编辑器增加一个命令,这个命令的触发可能会有一些条件限制,所以 addCommand
的第三个参数,就是使用createContextKey
方法定义的数据,当第三个参数的值为 true 的时候,才会添加这个命令
var myCondition1 = editor.createContextKey(
/*key name*/ "myCondition1",
/*default value*/ false
);
var myCondition2 = editor.createContextKey(
/*key name*/ "myCondition2",
/*default value*/ false
);
editor.addCommand(
monaco.KeyCode.Tab,
function () {
// services available in `ctx`
console.log("my command is executing!");
},
"myCondition1 && myCondition2"
);
addCommand
的定义:
addCommand(keybinding: number, handler: ICommandHandler, context?: string): string | null;
最后一个参数 context
其实就是 createContextKey()
方法定义的变量的 key 值,并且还能使用运算符比较厉害,并不是单纯的根据这个key去找 value,找到之后还能计算一波。