自定义生成器

你可以使用system.registercanonicalgenerator()注册一个标准生成器。但是,如果你想要标准生成器以外的功能,你可以自定义生成器。 Generator是一个带有若干个函数的接口,所以任何带有这些函数的对象都可以注册为Generator。 更多关于Generator的介绍,详见Generator接口

// in plugin/my-generator/index.js
import {systemInstance as system} from 'norma-core';

system.registerGenerator({
    name: "generator-name",
    ui: [],
    onInit(e) {
        e.state.positions = [];
    },
    onAddPosition(e) {
        e.state.positions.push(e.position);
    },
    onAddBlockType(e) { /* no-op */ },
    onAddDirection(e) { /* no-op */ },
    onRemovePoistion(e) { /* no-op */ },
    onRemoveBlockType(e) { /* no-op */ },
    onRemoveDirection(e) { /* no-op */ },
    isValidParameter(e) { /* no-op */ },
    generate(e) { /* no-op */ },
    UIHandler(e) { /* no-op */ },
    onExit(e) { /* no-op */ },
});

所有这些函数都接受e。对于onInitisValidParametergenerateonExite 只包含stateruntime。对于onAddPositiononAddBlockTypeonAddDirectione分别包含positionblockTypedirection,当然也包含stateruntime。对于onRemovePoistiononRemoveBlockTypeonRemoveDirectione 包含stateruntimeindex

还有三个函数onBluronFocusonItemUsed,它们是可选的。 onBluronFocus 将在每次切换生成器时被调用。如果这些函数不存在,它们不会被调用。

注意remove_last_positionremove_last_directionremove_last_blocktype 项会以indexundefined 调用它们,实际上目前还没有以number为index 的方式调用这些函数,但请注意每次都要小心测试index,以防我们添加这样的方式。

经典生成器和自定义生成器的区别

编写经典生成器和自定义生成器是非常不同的。经典生成器和自定义生成器之间的主要区别:

  • 自定义生成器没有description,只有nameui,即经典生成器中的description.namedescription.usage.optionUsage
  • 自定义生成器没有 option,你应该编写 onInit 来初始化你的 state
  • 自定义生成器在 state 上没有"positions", "blockTypes" 和 "directions"。如果你愿意,你可以自己使用这些key。请注意,你仍然不能使用以双下划线开头的key。如果 onAddPositiononAddBlockTypeonAddDirectiononRemovePoistiononRemoveBlockTypeonRemoveDirection 之一失败,你最好使用 runtime.logger 记录一些信息给用户纠正。使用logger的方式通常是logger.log("error", "Some message");
  • 自定义生成器有 isValidParameter,它应该返回一个boolean。每次使用物品execute时都会调用它。如果它返回 trueexecute 将继续并调用 generate,否则它将停止。你最好使用 runtime.logger 来记录一些信息给用户纠正。
  • 经典生成器在调用generate 后删除所有"positions", "blockTypes" 和 "directions",如果你自己编写"positions", "blockTypes" 和 "directions",你应该自己删除它们。

norma-core还提供了canonicalGeneratorFactory,如果你用配置经典生成器的参数对象调用它,它会为你创建一个经典生成器。

实际上,system.registerCanonicalGenerator(o)system.registerGenerator(canonicalGeneratorFactory(o))的简写。

results matching ""

    No results matching ""