vm.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. define(function (require) {
  2. return function () {
  3. var $form, _form, $preview;
  4. function getXs(unitCode) {
  5. switch (unitCode) {
  6. case '1':
  7. return 1;
  8. case '2':
  9. return 10;
  10. case '3':
  11. return 100;
  12. }
  13. return 1;
  14. }
  15. var prodDict = [
  16. { id: 'prod1', text: '产品1' },
  17. { id: 'prod2', text: '产品2' },
  18. { id: 'prod3', text: '产品3' },
  19. { id: 'prod4', text: '产品4' },
  20. { id: 'prod5', text: '产品5' },
  21. { id: 'prod6', text: '产品6' },
  22. { id: 'prod7', text: '产品7' },
  23. { id: 'prod8', text: '产品8' },
  24. { id: 'prod9', text: '产品9' },
  25. { id: 'prod10', text: '产品10' },
  26. { id: 'prod11', text: '产品11' },
  27. { id: 'prod12', text: '产品12' },
  28. ];
  29. var unitDict = [
  30. { id: '1', text: '个' },
  31. { id: '2', text: '盒' },
  32. { id: '3', text: '箱' }
  33. ];
  34. return {
  35. west: {
  36. onRender: function () {
  37. $preview = $(this);
  38. },
  39. title: '绑定效果',
  40. split: true,
  41. border: false,
  42. width: '400',
  43. items:
  44. '<p>hiddenUnit:<input class="textbox" v-model="hiddenUnit"></p>' +
  45. '<p>hiddenUnit2:<input class="textbox" v-model="hiddenUnit2"></p>' +
  46. '<p>{{unit$label}}:<input class="textbox" v-model="unit"></p>' +
  47. '<p>{{count1$label}}:<input class="textbox" v-model="count1"></p>' +
  48. '<p>{{count2$label}}:<input class="textbox" v-model="count2"></p>' +
  49. '<p>{{price$label}}:<input class="textbox" v-model="price"></p>' +
  50. '<p>{{total$label}}:<input class="textbox" v-model="total"></p>' +
  51. '<p>autoRemark:<input class="textbox" v-model="autoRemark"></p>' +
  52. '<p>autoCount:<input class="textbox" v-model="autoCount"></p>' +
  53. '<p>autoPrice:<input class="textbox" v-model="autoPrice"></p>' +
  54. '<p>rb:<input class="textbox" v-model="rb"></p>' +
  55. '<hr />' +
  56. '<p>{{prodCode$label}}:<input class="textbox" v-model="prodCode"></p>' +
  57. '<p>{{lot1$label}}:<input class="textbox" v-model="lot1"></p>' +
  58. '<p>{{lot2$label}}:<input class="textbox" v-model="lot2"></p>' +
  59. '<p>{{lot3$label}}:<input class="textbox" v-model="lot3"></p>' +
  60. '<p>{{lot4$label}}:<input class="textbox" v-model="lot4"></p>' +
  61. '<p>{{lot5$label}}:<input class="textbox" v-model="lot5"></p>' +
  62. '<p>{{lot6$label}}:<input class="textbox" v-model="lot6"></p>' +
  63. '<p>{{lot7$label}}:<input class="textbox" v-model="lot7"></p>' +
  64. '<p>{{lot8$label}}:<input class="textbox" v-model="lot8"></p>' +
  65. '<p>{{lot9$label}}:<input class="textbox" v-model="lot9"></p>' +
  66. '<p>{{lot10$label}}:<input class="textbox" v-model="lot10"></p>' +
  67. '<p>{{lot11$label}}:<input class="textbox" v-model="lot11"></p>' +
  68. '<p>{{lot12$label}}:<input class="textbox" v-model="lot12"></p>' +
  69. '<p>unit$text:{{unit$text}}</p>' +
  70. '<p>prodCode$text:{{prodCode$text}}</p>'
  71. },
  72. center: {
  73. title: '双向绑定演示',
  74. border: false,
  75. items: {
  76. onCreateViewModel: {
  77. previewElement: function () {
  78. return $preview[0]; //预览调试用的,实际情况下不需要设定
  79. },
  80. autoCreateLabel: true, //自动根据内部的组件的Label,创建对应的 name$label 属性
  81. binds: [
  82. //如果不使用上面的3个 auto, 就个性化的设定所需要的 binds
  83. //'prodCode$text', //combobox 组件,可以创建 name$text 代表combobox的显示值, combobox 的 value 对应还是 name 属性值
  84. 'hiddenUnit2'
  85. ]
  86. },
  87. onRender: function () {
  88. //$form 以 $ 开头命名,代表他是一个 jQuery-DOM 对象
  89. $form = $(this);
  90. _form = $form.vm();
  91. },
  92. xtype: 'form',
  93. //subLabelWidth: 140,
  94. items: [
  95. '<div class="form-box form-name">金额计算:</div>',
  96. [
  97. {
  98. xtype: 'hidden', name: 'hiddenUnit',
  99. watch: function (v) {
  100. this.hiddenUnit2 = v;
  101. }
  102. },
  103. {
  104. label: '收货单位', name: 'unit', data: unitDict, xtype: 'combobox', prompt: '空',
  105. watch: function (v) {
  106. //this 就是 viewModel 对象
  107. this.count2 = this.count1 * getXs(v);
  108. },
  109. watch$text: function (v) {
  110. this.hiddenUnit = v;
  111. }
  112. },
  113. {
  114. label: '预期数量(主单位)', name: 'count1', xtype: 'numberbox', min: 0, precision: 2, labelWidth: 'auto',
  115. watch: function (v) {
  116. this.count2 = v * getXs(this.unit);
  117. }
  118. },
  119. {
  120. label: '预期数量(收货单位)', name: 'count2', xtype: 'numberbox', min: 0, precision: 2, labelWidth: 'auto',
  121. watch: function (v) {
  122. this.count1 = v / getXs(this.unit);
  123. }
  124. }
  125. ], [
  126. {
  127. label: '单价', name: 'price', xtype: 'numberbox', min: 0, precision: 2,
  128. onChange: function (n, o) {
  129. $.yvan.msg('onChange unit from [' + o + '] to [' + n + ']');
  130. },
  131. watch: function (v) {
  132. console.log('prodCode 改掉了', v);
  133. }
  134. },
  135. {
  136. label: '总金额', name: 'total', min: 0, precision: 2, xtype: 'numberbox', computed: function () {
  137. return this.price * this.count2;
  138. }
  139. },
  140. ], [
  141. { xtype: 'offset' },
  142. {
  143. label: '自动备注', name: 'autoRemark', xtype: 'checkbox', value: 'Y', watch: function (v) {
  144. //if (v) {
  145. // this.remark = '';
  146. // $form.item('remark').textbox({
  147. // readonly: false,
  148. // prompt: '填写备注',
  149. // label: '备注'
  150. // });
  151. //} else {
  152. // $form.item('remark').textbox({
  153. // readonly: true,
  154. // prompt: '请选择收货单位',
  155. // label: '自动备注'
  156. // });
  157. //}
  158. }
  159. },
  160. { label: '自动计算数量', name: 'autoCount', xtype: 'checkbox', value: 'Y' },
  161. { label: '自动计算金额', name: 'autoPrice', xtype: 'checkbox', value: 'Y' }
  162. ], [
  163. {
  164. label: '自动备注', name: 'remark', span: 3, prompt: '请选择收货单位',
  165. computed: function () {
  166. if (!this.hiddenUnit2) {
  167. return '';
  168. }
  169. return '以' + this.price + '的单价,购买' + this.count1 + this.hiddenUnit2 + '(合计' + this.count2 + '),总价' + this.total;
  170. }
  171. }
  172. ], [
  173. { xtype: 'offset' },
  174. { xtype: 'radiobutton', label: '单选1-禁用', name: 'rb', value: 'a', disabled: true },
  175. { xtype: 'radiobutton', label: '单选2', name: 'rb', value: 'b' },
  176. { xtype: 'radiobutton', label: '单选3', name: 'rb', value: 'c', checked: true },
  177. { xtype: 'radiobutton', label: '单选4', name: 'rb', value: 'd' },
  178. ],
  179. '<div class="form-box form-name">助记码:</div>',
  180. [
  181. { label: '单位名称', name: 'orgName' },
  182. {
  183. label: '助记码', name: 'mnemonic',
  184. computed: function () {
  185. return pinyin.getCamelChars(this.orgName);
  186. }
  187. }
  188. ], [
  189. { xtype: 'offset' },
  190. {
  191. text: '提交', xtype: 'button', onClick: function () {
  192. var data = $form.formGet(true);
  193. console.log(data);
  194. }
  195. }, {
  196. text: '清空', xtype: 'button', onClick: function () {
  197. $form.formClear();
  198. }
  199. },
  200. ], [
  201. { xtype: 'offset' },
  202. {
  203. text: 'VM 改值', xtype: 'button', onClick: function () {
  204. $.extend(_form, {
  205. unit: 1,
  206. price: 0.91,
  207. count1: 23,
  208. prodCode: '',
  209. orgName: '九州通医药集团',
  210. autoRemark: 'N',
  211. autoCount: 'Y',
  212. autoPrice: 'Y',
  213. rb: 'a',
  214. lot1: 'lot1-vm',
  215. lot2: 'lot2-vm',
  216. lot3: 'lot3-vm',
  217. lot4: 'lot4-vm',
  218. lot5: 'lot5-vm',
  219. lot6: 'lot6-vm',
  220. lot7: 'lot7-vm',
  221. lot8: 'lot8-vm',
  222. lot9: 'lot9-vm',
  223. lot10: 'lot10-vm',
  224. lot11: 'lot11-vm',
  225. lot12: 'lot12-vm'
  226. });
  227. }
  228. }, {
  229. text: 'Form 改值', xtype: 'button', onClick: function () {
  230. $form.formSet({
  231. unit: 2,
  232. price: 1.71,
  233. count1: 41,
  234. prodCode: 'prod2',
  235. orgName: 'FBBC工程部',
  236. autoRemark: 'Y',
  237. autoCount: 'N',
  238. autoPrice: 'Y',
  239. rb: 'b',
  240. lot1: 'lot1-formSet',
  241. lot2: 'lot2-formSet',
  242. lot3: 'lot3-formSet',
  243. lot4: 'lot4-formSet',
  244. lot5: 'lot5-formSet',
  245. lot6: 'lot6-formSet',
  246. lot7: 'lot7-formSet',
  247. lot8: 'lot8-formSet',
  248. lot9: 'lot9-formSet',
  249. lot10: 'lot10-formSet',
  250. lot11: 'lot11-formSet',
  251. lot12: 'lot12-formSet'
  252. });
  253. }
  254. }, {
  255. text: 'jQuery 改值', xtype: 'button', onClick: function () {
  256. $form.find('input[name="rb"]').val('c').change();
  257. $form.find('input[name="autoRemark"]').val('Y').change();
  258. $form.find('input[name="autoCount"]').val('Y').change();
  259. $form.find('input[name="autoPrice"]').val('N').change();
  260. //$form.find('input[name="unit"]').val(3).change();
  261. //$form.find('input[name="price"]').val(1.71).change();
  262. //$form.find('input[name="count1"]').val(99).change();
  263. //$form.find('input[name="prodCode"]').val('prod1').change();
  264. //$form.find('input[name="orgName"]').val('不知名公司').change();
  265. //$form.find('input[name="lot1"]').val('lot1-jQuery').change();
  266. //$form.find('input[name="lot2"]').val('lot2-jQuery').change();
  267. //$form.find('input[name="lot3"]').val('lot3-jQuery').change();
  268. //$form.find('input[name="lot4"]').val('lot4-jQuery').change();
  269. //$form.find('input[name="lot5"]').val('lot5-jQuery').change();
  270. //$form.find('input[name="lot6"]').val('lot6-jQuery').change();
  271. //$form.find('input[name="lot7"]').val('lot7-jQuery').change();
  272. //$form.find('input[name="lot8"]').val('lot8-jQuery').change();
  273. //$form.find('input[name="lot9"]').val('lot9-jQuery').change();
  274. //$form.find('input[name="lot10"]').val('lot10-jQuery').change();
  275. //$form.find('input[name="lot11"]').val('lot11-jQuery').change();
  276. //$form.find('input[name="lot12"]').val('lot12-jQuery').change();
  277. }
  278. }
  279. ], [
  280. {
  281. label: '产品名称', name: 'prodCode', xtype: 'combobox', data: prodDict, prompt: '空白',
  282. watch$text: function (v) {
  283. if (v) {
  284. this.lot1$label = v + '-' + '1';
  285. this.lot2$label = v + '-' + '2';
  286. this.lot3$label = v + '-' + '3';
  287. this.lot4$label = v + '-' + '4';
  288. this.lot5$label = v + '-' + '5';
  289. this.lot6$label = v + '-' + '6';
  290. this.lot7$label = v + '-' + '7';
  291. this.lot8$label = v + '-' + '8';
  292. this.lot9$label = v + '-' + '9';
  293. this.lot10$label = v + '-' + '10';
  294. this.lot11$label = v + '-' + '11';
  295. this.lot12$label = v + '-' + '12';
  296. } else {
  297. this.lot1$label = '批属性1';
  298. this.lot2$label = '批属性2';
  299. this.lot3$label = '批属性3';
  300. this.lot4$label = '批属性4';
  301. this.lot5$label = '批属性5';
  302. this.lot6$label = '批属性6';
  303. this.lot7$label = '批属性7';
  304. this.lot8$label = '批属性8';
  305. this.lot9$label = '批属性9';
  306. this.lot10$label = '批属性10';
  307. this.lot11$label = '批属性11';
  308. this.lot12$label = '批属性12';
  309. }
  310. }
  311. },
  312. ], [
  313. { label: '批属性1', name: 'lot1' },
  314. { label: '批属性2', name: 'lot2' },
  315. { label: '批属性3', name: 'lot3' },
  316. ], [
  317. { label: '批属性4', name: 'lot4' },
  318. { label: '批属性5', name: 'lot5' },
  319. { label: '批属性6', name: 'lot6' },
  320. ], [
  321. { label: '批属性7', name: 'lot7' },
  322. { label: '批属性8', name: 'lot8' },
  323. { label: '批属性9', name: 'lot9' },
  324. ], [
  325. { label: '批属性10', name: 'lot10' },
  326. { label: '批属性11', name: 'lot11' },
  327. { label: '批属性12', name: 'lot12' },
  328. ]
  329. ]
  330. }
  331. }
  332. };
  333. };
  334. });