44e9649a01209c04f9ced1564d57df23b9b965cf.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. System.register(["__unresolved_0", "cc", "__unresolved_1"], function (_export, _context) {
  2. "use strict";
  3. var _reporterNs, _cclegacy, __checkObsolete__, __checkObsoleteInNamespace__, director, log, JsonOb, ViewModel, VMManager, _crd, VM_EMIT_HEAD, DEBUG_SHOW_PATH, VM;
  4. /** 通过 . 路径设置值 */
  5. function setValueFromPath(obj, path, value, tag) {
  6. if (tag === void 0) {
  7. tag = '';
  8. }
  9. var props = path.split('.');
  10. for (var i = 0; i < props.length; i++) {
  11. var propName = props[i];
  12. if (propName in obj === false) {
  13. console.error('[' + propName + '] not find in ' + tag + '.' + path);
  14. break;
  15. }
  16. if (i == props.length - 1) {
  17. obj[propName] = value;
  18. } else {
  19. obj = obj[propName];
  20. }
  21. }
  22. }
  23. /** 通过 . 路径 获取值 */
  24. function getValueFromPath(obj, path, def, tag) {
  25. if (tag === void 0) {
  26. tag = '';
  27. }
  28. var props = path.split('.');
  29. for (var i = 0; i < props.length; i++) {
  30. var propName = props[i];
  31. if (propName in obj === false) {
  32. console.error('[' + propName + '] not find in ' + tag + '.' + path);
  33. return def;
  34. }
  35. obj = obj[propName];
  36. }
  37. if (obj === null || typeof obj === "undefined") obj = def; //如果g == null 则返回一个默认值
  38. return obj;
  39. }
  40. /**
  41. * ModelViewer 类
  42. */
  43. function _reportPossibleCrUseOfJsonOb(extras) {
  44. _reporterNs.report("JsonOb", "./JsonOb", _context.meta, extras);
  45. }
  46. return {
  47. setters: [function (_unresolved_) {
  48. _reporterNs = _unresolved_;
  49. }, function (_cc) {
  50. _cclegacy = _cc.cclegacy;
  51. __checkObsolete__ = _cc.__checkObsolete__;
  52. __checkObsoleteInNamespace__ = _cc.__checkObsoleteInNamespace__;
  53. director = _cc.director;
  54. log = _cc.log;
  55. }, function (_unresolved_2) {
  56. JsonOb = _unresolved_2.JsonOb;
  57. }],
  58. execute: function () {
  59. _crd = true;
  60. _cclegacy._RF.push({}, "54f75k4X+RP0qaXOzrfZysL", "ViewModel", undefined);
  61. __checkObsolete__(['director', 'log']);
  62. VM_EMIT_HEAD = 'VC:';
  63. DEBUG_SHOW_PATH = false;
  64. ViewModel = class ViewModel {
  65. constructor(data, tag) {
  66. this.$data = void 0;
  67. // 索引值用的标签
  68. this._tag = null;
  69. /** 激活状态, 将会通过 director.emit 发送值变动的信号, 适合需要屏蔽的情况 */
  70. this.active = true;
  71. /** 是否激活根路径回调通知, 不激活的情况下 只能监听末端路径值来判断是否变化 */
  72. this.emitToRootPath = false;
  73. new (_crd && JsonOb === void 0 ? (_reportPossibleCrUseOfJsonOb({
  74. error: Error()
  75. }), JsonOb) : JsonOb)(data, this._callback.bind(this));
  76. this.$data = data;
  77. this._tag = tag;
  78. }
  79. // 回调函数 请注意 回调的 path 数组是 引用类型,禁止修改
  80. _callback(n, o, path) {
  81. if (this.active == true) {
  82. var name = VM_EMIT_HEAD + this._tag + '.' + path.join('.');
  83. if (DEBUG_SHOW_PATH) log('>>', n, o, path);
  84. director.emit(name, n, o, [this._tag].concat(path)); // 通知末端路径
  85. if (this.emitToRootPath) director.emit(VM_EMIT_HEAD + this._tag, n, o, path); // 通知主路径
  86. if (path.length >= 2) {
  87. for (var i = 0; i < path.length - 1; i++) {
  88. var e = path[i]; //log('中端路径');
  89. }
  90. }
  91. }
  92. } // 通过路径设置数据的方法
  93. setValue(path, value) {
  94. setValueFromPath(this.$data, path, value, this._tag);
  95. } // 获取路径的值
  96. getValue(path, def) {
  97. return getValueFromPath(this.$data, path, def, this._tag);
  98. }
  99. };
  100. /**
  101. * VM 对象管理器(工厂)
  102. */
  103. VMManager = class VMManager {
  104. constructor() {
  105. this._mvs = new Map();
  106. this.setObjValue = setValueFromPath;
  107. this.getObjValue = getValueFromPath;
  108. }
  109. /**
  110. * 绑定一个数据,并且可以由VM所管理(绑定的数据只能是值类型)
  111. * @param data 需要绑定的数据
  112. * @param tag 对应该数据的标签(用于识别为哪个VM,不允许重复)
  113. * @param activeRootObject 激活主路径通知,可能会有性能影响,一般不使用
  114. */
  115. add(data, tag, activeRootObject) {
  116. if (tag === void 0) {
  117. tag = 'global';
  118. }
  119. if (activeRootObject === void 0) {
  120. activeRootObject = false;
  121. }
  122. var vm = new ViewModel(data, tag);
  123. var has = this._mvs.get(tag);
  124. if (tag.includes('.')) {
  125. console.error('cant write . in tag:', tag);
  126. return;
  127. }
  128. if (has) {
  129. console.error('already set VM tag:' + tag);
  130. return;
  131. }
  132. vm.emitToRootPath = activeRootObject;
  133. this._mvs.set(tag, vm);
  134. }
  135. /**
  136. * 移除并且销毁 VM 对象
  137. * @param tag
  138. */
  139. remove(tag) {
  140. this._mvs.delete(tag);
  141. }
  142. /**
  143. * 获取绑定的数据
  144. * @param tag 数据tag
  145. */
  146. get(tag) {
  147. var res = this._mvs.get(tag);
  148. return res;
  149. }
  150. /**
  151. * 通过全局路径,而不是 VM 对象来 设置值
  152. * @param path - 全局取值路径
  153. * @param value - 需要增加的值
  154. */
  155. addValue(path, value) {
  156. path = path.trim(); //防止空格,自动剔除
  157. var rs = path.split('.');
  158. if (rs.length < 2) {
  159. console.error('Cant find path:' + path);
  160. }
  161. ;
  162. var vm = this.get(rs[0]);
  163. if (!vm) {
  164. console.error('Cant Set VM:' + rs[0]);
  165. return;
  166. }
  167. ;
  168. var resPath = rs.slice(1).join('.');
  169. vm.setValue(resPath, vm.getValue(resPath) + value);
  170. }
  171. /**
  172. * 通过全局路径,而不是 VM 对象来 获取值
  173. * @param path - 全局取值路径
  174. * @param def - 如果取不到值的返回的默认值
  175. */
  176. getValue(path, def) {
  177. path = path.trim(); // 防止空格,自动剔除
  178. var rs = path.split('.');
  179. if (rs.length < 2) {
  180. console.error('Get Value Cant find path:' + path);
  181. return;
  182. }
  183. ;
  184. var vm = this.get(rs[0]);
  185. if (!vm) {
  186. console.error('Cant Get VM:' + rs[0]);
  187. return;
  188. }
  189. ;
  190. return vm.getValue(rs.slice(1).join('.'), def);
  191. }
  192. /**
  193. * 通过全局路径,而不是 VM 对象来 设置值
  194. * @param path - 全局取值路径
  195. * @param value - 需要设置的值
  196. */
  197. setValue(path, value) {
  198. path = path.trim(); // 防止空格,自动剔除
  199. var rs = path.split('.');
  200. if (rs.length < 2) {
  201. console.error('Set Value Cant find path:' + path);
  202. return;
  203. }
  204. ;
  205. var vm = this.get(rs[0]);
  206. if (!vm) {
  207. console.error('Cant Set VM:' + rs[0]);
  208. return;
  209. }
  210. ;
  211. vm.setValue(rs.slice(1).join('.'), value);
  212. }
  213. /** 等同于 director.on */
  214. bindPath(path, callback, target, useCapture) {
  215. path = path.trim(); // 防止空格,自动剔除
  216. if (path == '') {
  217. console.error(target.node.name, '节点绑定的路径为空');
  218. return;
  219. }
  220. if (path.split('.')[0] === '*') {
  221. console.error(path, '路径不合法,可能错误覆盖了 VMParent 的onLoad 方法, 或者父节点并未挂载 VMParent 相关的组件脚本');
  222. return;
  223. } // @ts-ignore
  224. director.on(VM_EMIT_HEAD + path, callback, target, useCapture);
  225. }
  226. /** 等同于 director.off */
  227. unbindPath(path, callback, target) {
  228. path = path.trim(); //防止空格,自动剔除
  229. if (path.split('.')[0] === '*') {
  230. console.error(path, '路径不合法,可能错误覆盖了 VMParent 的onLoad 方法, 或者父节点并未挂载 VMParent 相关的组件脚本');
  231. return;
  232. } // @ts-ignore
  233. director.off(VM_EMIT_HEAD + path, callback, target);
  234. }
  235. /** 冻结所有标签的 VM,视图将不会受到任何信息 */
  236. inactive() {
  237. this._mvs.forEach(mv => {
  238. mv.active = false;
  239. });
  240. }
  241. /** 激活所有标签的 VM*/
  242. active() {
  243. this._mvs.forEach(mv => {
  244. mv.active = false;
  245. });
  246. }
  247. }; // 整数、小数、时间、缩写
  248. /**
  249. * VM管理对象,使用文档:
  250. * https://github.com/wsssheep/cocos_creator_mvvm_tools/blob/master/docs/ViewModelScript.md
  251. */
  252. _export("VM", VM = new VMManager());
  253. _cclegacy._RF.pop();
  254. _crd = false;
  255. }
  256. };
  257. });
  258. //# sourceMappingURL=44e9649a01209c04f9ced1564d57df23b9b965cf.js.map