725bfcb9e7c26301eb1609b134d884e75a7ce320.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. System.register(["cc"], function (_export, _context) {
  2. "use strict";
  3. var _cclegacy, __checkObsolete__, __checkObsoleteInNamespace__, _crd, AutoBindMap;
  4. function autoBind(componentTypeOrTarget, propertyKey) {
  5. if (propertyKey !== undefined) {
  6. //情况1:@autoBind 不传参
  7. var _target = componentTypeOrTarget;
  8. if (!AutoBindMap.has(_target)) {
  9. AutoBindMap.set(_target, {});
  10. }
  11. AutoBindMap.get(_target)[propertyKey] = {};
  12. return;
  13. } //情况2:@autoBind(Label) 或 @autoBind({type: Label})
  14. return function (target, propertyKey) {
  15. if (!AutoBindMap.has(target)) {
  16. AutoBindMap.set(target, {});
  17. }
  18. var options = typeof componentTypeOrTarget === "function" ? {
  19. type: componentTypeOrTarget
  20. } : componentTypeOrTarget;
  21. AutoBindMap.get(target)[propertyKey] = options;
  22. };
  23. }
  24. /**
  25. * 获取变量的类型
  26. */
  27. function getComponentType(instance, propertyKey, binding) {
  28. //1. 优先用 @autoBind 指定的类型
  29. if (binding.type) {
  30. return binding.type;
  31. } //2. 尝试从变量默认值推断(如 `= null! as Label`)
  32. var defaultValue = instance[propertyKey];
  33. if (defaultValue !== null && defaultValue !== undefined) {
  34. return defaultValue.constructor;
  35. } //3. 尝试从类型断言推断(如 `= null! as Label`)
  36. //注意:这种方式在运行时无法获取类型信息,需要用户确保正确使用
  37. // 这里我们无法直接获取类型断言信息,只能依赖用户正确设置默认值
  38. //4. 如果仍然没有,返回 null(绑定节点而非组件)
  39. return null;
  40. }
  41. /**
  42. * 在onLoad中调用这个函数然后才会自动绑定。initAutoBindings(this)。
  43. */
  44. function initAutoBindings(instance) {
  45. var bindings = AutoBindMap.get(Object.getPrototypeOf(instance));
  46. if (!bindings) return;
  47. var nameMap = new Map();
  48. buildNodeNameMap(instance.node, nameMap);
  49. for (var _propertyKey in bindings) {
  50. var binding = bindings[_propertyKey];
  51. var node = nameMap.get(_propertyKey);
  52. if (!node) {
  53. //Logger.warn(`[AutoBind] 节点未找到: ${propertyKey}`);
  54. continue;
  55. }
  56. var _componentType = getComponentType(instance, _propertyKey, binding);
  57. if (_componentType && !(node instanceof _componentType)) {
  58. // 关键修改:排除 Node 类型
  59. instance[_propertyKey] = node.getComponent(_componentType); //Logger.log(`[AutoBind] 绑定组件 ${propertyKey}:`, componentType.name);
  60. } else {
  61. instance[_propertyKey] = node; // 直接绑定节点
  62. // Logger.log(`[AutoBind] 绑定节点 ${propertyKey}`);
  63. }
  64. }
  65. }
  66. function buildNodeNameMap(node, nameMap) {
  67. nameMap.set(node.name, node);
  68. for (var child of node.children) {
  69. buildNodeNameMap(child, nameMap);
  70. }
  71. }
  72. _export({
  73. autoBind: autoBind,
  74. initAutoBindings: initAutoBindings
  75. });
  76. return {
  77. setters: [function (_cc) {
  78. _cclegacy = _cc.cclegacy;
  79. __checkObsolete__ = _cc.__checkObsolete__;
  80. __checkObsoleteInNamespace__ = _cc.__checkObsoleteInNamespace__;
  81. }],
  82. execute: function () {
  83. _crd = true;
  84. _cclegacy._RF.push({}, "02dbcLwQzZCspaVMhjyt9dj", "AutoBind", undefined);
  85. __checkObsolete__(['Component']);
  86. AutoBindMap = new WeakMap();
  87. /**
  88. * 自动绑定与变量同名的子节点。
  89. * 装饰器不传参数(组件)则绑定节点,传了组件则绑定节点上的组件。
  90. * 如果传了组件,则传入的组件一定要和变量类型一致,否则绑定会失败。
  91. * 记得在组件的onLoad函数调用initAutoBindings(this)
  92. 事例:
  93. "@autoBind不传" 绑定是节点
  94. ”@autoBind(Label)“ 绑定的是Label
  95. “@autoBind({type: Label,tooltip: "文本"})” 绑定的是Label
  96. */
  97. _cclegacy._RF.pop();
  98. _crd = false;
  99. }
  100. };
  101. });
  102. //# sourceMappingURL=725bfcb9e7c26301eb1609b134d884e75a7ce320.js.map