123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- System.register(["cc"], function (_export, _context) {
- "use strict";
- var _cclegacy, __checkObsolete__, __checkObsoleteInNamespace__, _crd, AutoBindMap;
- function autoBind(componentTypeOrTarget, propertyKey) {
- if (propertyKey !== undefined) {
- //情况1:@autoBind 不传参
- var _target = componentTypeOrTarget;
- if (!AutoBindMap.has(_target)) {
- AutoBindMap.set(_target, {});
- }
- AutoBindMap.get(_target)[propertyKey] = {};
- return;
- } //情况2:@autoBind(Label) 或 @autoBind({type: Label})
- return function (target, propertyKey) {
- if (!AutoBindMap.has(target)) {
- AutoBindMap.set(target, {});
- }
- var options = typeof componentTypeOrTarget === "function" ? {
- type: componentTypeOrTarget
- } : componentTypeOrTarget;
- AutoBindMap.get(target)[propertyKey] = options;
- };
- }
- /**
- * 获取变量的类型
- */
- function getComponentType(instance, propertyKey, binding) {
- //1. 优先用 @autoBind 指定的类型
- if (binding.type) {
- return binding.type;
- } //2. 尝试从变量默认值推断(如 `= null! as Label`)
- var defaultValue = instance[propertyKey];
- if (defaultValue !== null && defaultValue !== undefined) {
- return defaultValue.constructor;
- } //3. 尝试从类型断言推断(如 `= null! as Label`)
- //注意:这种方式在运行时无法获取类型信息,需要用户确保正确使用
- // 这里我们无法直接获取类型断言信息,只能依赖用户正确设置默认值
- //4. 如果仍然没有,返回 null(绑定节点而非组件)
- return null;
- }
- /**
- * 在onLoad中调用这个函数然后才会自动绑定。initAutoBindings(this)。
- */
- function initAutoBindings(instance) {
- var bindings = AutoBindMap.get(Object.getPrototypeOf(instance));
- if (!bindings) return;
- var nameMap = new Map();
- buildNodeNameMap(instance.node, nameMap);
- for (var _propertyKey in bindings) {
- var binding = bindings[_propertyKey];
- var node = nameMap.get(_propertyKey);
- if (!node) {
- //Logger.warn(`[AutoBind] 节点未找到: ${propertyKey}`);
- continue;
- }
- var _componentType = getComponentType(instance, _propertyKey, binding);
- if (_componentType && !(node instanceof _componentType)) {
- // 关键修改:排除 Node 类型
- instance[_propertyKey] = node.getComponent(_componentType); //Logger.log(`[AutoBind] 绑定组件 ${propertyKey}:`, componentType.name);
- } else {
- instance[_propertyKey] = node; // 直接绑定节点
- // Logger.log(`[AutoBind] 绑定节点 ${propertyKey}`);
- }
- }
- }
- function buildNodeNameMap(node, nameMap) {
- nameMap.set(node.name, node);
- for (var child of node.children) {
- buildNodeNameMap(child, nameMap);
- }
- }
- _export({
- autoBind: autoBind,
- initAutoBindings: initAutoBindings
- });
- return {
- setters: [function (_cc) {
- _cclegacy = _cc.cclegacy;
- __checkObsolete__ = _cc.__checkObsolete__;
- __checkObsoleteInNamespace__ = _cc.__checkObsoleteInNamespace__;
- }],
- execute: function () {
- _crd = true;
- _cclegacy._RF.push({}, "02dbcLwQzZCspaVMhjyt9dj", "AutoBind", undefined);
- __checkObsolete__(['Component']);
- AutoBindMap = new WeakMap();
- /**
- * 自动绑定与变量同名的子节点。
- * 装饰器不传参数(组件)则绑定节点,传了组件则绑定节点上的组件。
- * 如果传了组件,则传入的组件一定要和变量类型一致,否则绑定会失败。
- * 记得在组件的onLoad函数调用initAutoBindings(this)
- 事例:
- "@autoBind不传" 绑定是节点
- ”@autoBind(Label)“ 绑定的是Label
- “@autoBind({type: Label,tooltip: "文本"})” 绑定的是Label
- */
- _cclegacy._RF.pop();
- _crd = false;
- }
- };
- });
- //# sourceMappingURL=725bfcb9e7c26301eb1609b134d884e75a7ce320.js.map
|