laydate在angular中的应用

复制代码
  1 /**
  2 
  3  @Name : layDate v1.1 日期控件
  4  @Author: 贤心
  5  @Date: 2014-06-25
  6  @QQ群:176047195
  7  @Site:http://sentsin.com/layui/laydate
  8 
  9  */
 10 
 11 ;!function (a) {
 12     var b = {
 13         path: "",
 14         defSkin: "default",
 15         format: "YYYY-MM-DD",
 16         min: "1900-01-01 00:00:00",
 17         max: "2099-12-31 23:59:59",
 18         isv: !1
 19     }, c = {}, d = document, e = "createElement", f = "getElementById", g = "getElementsByTagName", h = ["laydate_box", "laydate_void", "laydate_click", "LayDateSkin", "skins/", "/laydate.css"];
 20     var cb = function () {
 21     };
 22     a.laydate = function (b, callback) {
 23         b = b || {};
 24         cb = callback;
 25         try {
 26             h.event = a.event ? a.event : laydate.caller.arguments[0]
 27         } catch (d) {
 28         }
 29         return c.run(b), laydate
 30     }, laydate.v = "1.1", c.getPath = function () {
 31         var a = document.scripts, c = a[a.length - 1].src;
 32         return b.path ? b.path : c.substring(0, c.lastIndexOf("/") + 1)
 33     }(), c.use = function (a, b) {
 34         var f = d[e]("link");
 35         f.type = "text/css", f.rel = "stylesheet", f.href = c.getPath + a + h[5], b && (f.id = b), d[g]("head")[0].appendChild(f), f = null
 36     }, c.trim = function (a) {
 37         return a = a || "", a.replace(/^\s|\s$/g, "").replace(/\s+/g, " ")
 38     }, c.digit = function (a) {
 39         return 10 > a ? "0" + (0 | a) : a
 40     }, c.stopmp = function (b) {
 41         return b = b || a.event, b.stopPropagation ? b.stopPropagation() : b.cancelBubble = !0, this
 42     }, c.each = function (a, b) {
 43         for (var c = 0, d = a.length; d > c && b(c, a[c]) !== !1; c++);
 44     }, c.hasClass = function (a, b) {
 45         return a = a || {}, new RegExp("\\b" + b + "\\b").test(a.className)
 46     }, c.addClass = function (a, b) {
 47         return a = a || {}, c.hasClass(a, b) || (a.className += " " + b), a.className = c.trim(a.className), this
 48     }, c.removeClass = function (a, b) {
 49         if (a = a || {}, c.hasClass(a, b)) {
 50             var d = new RegExp("\\b" + b + "\\b");
 51             a.className = a.className.replace(d, "")
 52         }
 53         return this
 54     }, c.removeCssAttr = function (a, b) {
 55         var c = a.style;
 56         c.removeProperty ? c.removeProperty(b) : c.removeAttribute(b)
 57     }, c.shde = function (a, b) {
 58         a.style.display = b ? "none" : "block"
 59     }, c.query = function (a) {
 60         var e, b, h, i, j;
 61         return a = c.trim(a).split(" "), b = d[f](a[0].substr(1)), b ? a[1] ? /^\./.test(a[1]) ? (i = a[1].substr(1), j = new RegExp("\\b" + i + "\\b"), e = [], h = d.getElementsByClassName ? b.getElementsByClassName(i) : b[g]("*"), c.each(h, function (a, b) {
 62             j.test(b.className) && e.push(b)
 63         }), e[0] ? e : "") : (e = b[g](a[1]), e[0] ? b[g](a[1]) : "") : b : void 0
 64     }, c.on = function (b, d, e) {
 65         return b.attachEvent ? b.attachEvent("on" + d, function () {
 66             e.call(b, a.even)
 67         }) : b.addEventListener(d, e, !1), c
 68     }, c.stopMosup = function (a, b) {
 69         "mouseup" !== a && c.on(b, "mouseup", function (a) {
 70             c.stopmp(a)
 71         })
 72     }, c.run = function (a) {
 73         var d, e, g, b = c.query, f = h.event;
 74         try {
 75             g = f.target || f.srcElement || {}
 76         } catch (i) {
 77             g = {}
 78         }
 79         if (d = a.elem ? b(a.elem) : g, f && g.tagName) {
 80             if (!d || d === c.elem)return;
 81             c.stopMosup(f.type, d), c.stopmp(f), c.view(d, a), c.reshow()
 82         } else e = a.event || "click", c.each((0 | d.length) > 0 ? d : [d], function (b, d) {
 83             c.stopMosup(e, d), c.on(d, e, function (b) {
 84                 c.stopmp(b), d !== c.elem && (c.view(d, a), c.reshow())
 85             })
 86         })
 87     }, c.scroll = function (a) {
 88         return a = a ? "scrollLeft" : "scrollTop", d.body[a] | d.documentElement[a]
 89     }, c.winarea = function (a) {
 90         return document.documentElement[a ? "clientWidth" : "clientHeight"]
 91     }, c.isleap = function (a) {
 92         return 0 === a % 4 && 0 !== a % 100 || 0 === a % 400
 93     }, c.checkVoid = function (a, b, d) {
 94         var e = [];
 95         return a = 0 | a, b = 0 | b, d = 0 | d, a < c.mins[0] ? e = ["y"] : a > c.maxs[0] ? e = ["y", 1] : a >= c.mins[0] && a <= c.maxs[0] && (a == c.mins[0] && (b < c.mins[1] ? e = ["m"] : b == c.mins[1] && d < c.mins[2] && (e = ["d"])), a == c.maxs[0] && (b > c.maxs[1] ? e = ["m", 1] : b == c.maxs[1] && d > c.maxs[2] && (e = ["d", 1]))), e
 96     }, c.timeVoid = function (a, b) {
 97         if (c.ymd[1] + 1 == c.mins[1] && c.ymd[2] == c.mins[2]) {
 98             if (0 === b && a < c.mins[3])return 1;
 99             if (1 === b && a < c.mins[4])return 1;
100             if (2 === b && a < c.mins[5])return 1
101         } else if (c.ymd[1] + 1 == c.maxs[1] && c.ymd[2] == c.maxs[2]) {
102             if (0 === b && a > c.maxs[3])return 1;
103             if (1 === b && a > c.maxs[4])return 1;
104             if (2 === b && a > c.maxs[5])return 1
105         }
106         return a > (b ? 59 : 23) ? 1 : void 0
107     }, c.check = function () {
108         var a = c.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g, "\\d+\\").replace(/\\$/g, ""), b = new RegExp(a), d = c.elem[h.elemv], e = d.match(/\d+/g) || [], f = c.checkVoid(e[0], e[1], e[2]);
109         if ("" !== d.replace(/\s/g, "")) {
110             if (!b.test(d))return c.elem[h.elemv] = "", c.msg("日期不符合格式,请重新选择。"), 1;
111             if (f[0])return c.elem[h.elemv] = "", c.msg("日期不在有效期内,请重新选择。"), 1;
112             f.value = c.elem[h.elemv].match(b).join(), e = f.value.match(/\d+/g), e[1] < 1 ? (e[1] = 1, f.auto = 1) : e[1] > 12 ? (e[1] = 12, f.auto = 1) : e[1].length < 2 && (f.auto = 1), e[2] < 1 ? (e[2] = 1, f.auto = 1) : e[2] > c.months[(0 | e[1]) - 1] ? (e[2] = 31, f.auto = 1) : e[2].length < 2 && (f.auto = 1), e.length > 3 && (c.timeVoid(e[3], 0) && (f.auto = 1), c.timeVoid(e[4], 1) && (f.auto = 1), c.timeVoid(e[5], 2) && (f.auto = 1)), f.auto ? c.creation([e[0], 0 | e[1], 0 | e[2]], 1) : f.value !== c.elem[h.elemv] && (c.elem[h.elemv] = f.value)
113         }
114     }, c.months = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], c.viewDate = function (a, b, d) {
115         var f = (c.query, {}), g = new Date;
116         a < (0 | c.mins[0]) && (a = 0 | c.mins[0]), a > (0 | c.maxs[0]) && (a = 0 | c.maxs[0]), g.setFullYear(a, b, d), f.ymd = [g.getFullYear(), g.getMonth(), g.getDate()], c.months[1] = c.isleap(f.ymd[0]) ? 29 : 28, g.setFullYear(f.ymd[0], f.ymd[1], 1), f.FDay = g.getDay(), f.PDay = c.months[0 === b ? 11 : b - 1] - f.FDay + 1, f.NDay = 1, c.each(h.tds, function (a, b) {
117             var g, d = f.ymd[0], e = f.ymd[1] + 1;
118             b.className = "", a < f.FDay ? (b.innerHTML = g = a + f.PDay, c.addClass(b, "laydate_nothis"), 1 === e && (d -= 1), e = 1 === e ? 12 : e - 1) : a >= f.FDay && a < f.FDay + c.months[f.ymd[1]] ? (b.innerHTML = g = a - f.FDay + 1, a - f.FDay + 1 === f.ymd[2] && (c.addClass(b, h[2]), f.thisDay = b)) : (b.innerHTML = g = f.NDay++, c.addClass(b, "laydate_nothis"), 12 === e && (d += 1), e = 12 === e ? 1 : e + 1), c.checkVoid(d, e, g)[0] && c.addClass(b, h[1]), c.options.festival && c.festival(b, e + "." + g), b.setAttribute("y", d), b.setAttribute("m", e), b.setAttribute("d", g), d = e = g = null
119         }), c.valid = !c.hasClass(f.thisDay, h[1]), c.ymd = f.ymd, h.year.value = c.ymd[0] + "年", h.month.value = c.digit(c.ymd[1] + 1) + "月", c.each(h.mms, function (a, b) {
120             var d = c.checkVoid(c.ymd[0], (0 | b.getAttribute("m")) + 1);
121             "y" === d[0] || "m" === d[0] ? c.addClass(b, h[1]) : c.removeClass(b, h[1]), c.removeClass(b, h[2]), d = null
122         }), c.addClass(h.mms[c.ymd[1]], h[2]), f.times = [0 | c.inymd[3] || 0, 0 | c.inymd[4] || 0, 0 | c.inymd[5] || 0], c.each(new Array(3), function (a) {
123             c.hmsin[a].value = c.digit(c.timeVoid(f.times[a], a) ? 0 | c.mins[a + 3] : 0 | f.times[a])
124         }), c[c.valid ? "removeClass" : "addClass"](h.ok, h[1])
125     }, c.festival = function (a, b) {
126         var c;
127         switch (b) {
128             case"1.1":
129                 c = "元旦";
130                 break;
131             case"3.8":
132                 c = "妇女";
133                 break;
134             case"4.5":
135                 c = "清明";
136                 break;
137             case"5.1":
138                 c = "劳动";
139                 break;
140             case"6.1":
141                 c = "儿童";
142                 break;
143             case"9.10":
144                 c = "教师";
145                 break;
146             case"10.1":
147                 c = "国庆"
148         }
149         c && (a.innerHTML = c), c = null
150     }, c.viewYears = function (a) {
151         var b = c.query, d = "";
152         c.each(new Array(14), function (b) {
153             d += 7 === b ? "<li " + (parseInt(h.year.value) === a ? 'class="' + h[2] + '"' : "") + ' y="' + a + '">' + a + "年</li>" : '<li y="' + (a - 7 + b) + '">' + (a - 7 + b) + "年</li>"
154         }), b("#laydate_ys").innerHTML = d, c.each(b("#laydate_ys li"), function (a, b) {
155             "y" === c.checkVoid(b.getAttribute("y"))[0] ? c.addClass(b, h[1]) : c.on(b, "click", function (a) {
156                 c.stopmp(a).reshow(), c.viewDate(0 | this.getAttribute("y"), c.ymd[1], c.ymd[2])
157             })
158         })
159     }, c.initDate = function () {
160         var d = (c.query, new Date), e = c.elem[h.elemv].match(/\d+/g) || [];
161         e.length < 3 && (e = c.options.start.match(/\d+/g) || [], e.length < 3 && (e = [d.getFullYear(), d.getMonth() + 1, d.getDate()])), c.inymd = e, c.viewDate(e[0], e[1] - 1, e[2])
162     }, c.iswrite = function () {
163         var a = c.query, b = {time: a("#laydate_hms")};
164         c.shde(b.time, !c.options.istime), c.shde(h.oclear, !("isclear" in c.options ? c.options.isclear : 1)), c.shde(h.otoday, !("istoday" in c.options ? c.options.istoday : 1)), c.shde(h.ok, !("issure" in c.options ? c.options.issure : 1))
165     }, c.orien = function (a, b) {
166         var d, e = c.elem.getBoundingClientRect();
167         a.style.left = e.left + (b ? 0 : c.scroll(1)) + "px", d = e.bottom + a.offsetHeight / 1.5 <= c.winarea() ? e.bottom - 1 : e.top > a.offsetHeight / 1.5 ? e.top - a.offsetHeight + 1 : c.winarea() - a.offsetHeight, a.style.top = d + (b ? 0 : c.scroll()) + "px"
168     }, c.follow = function (a) {
169         c.options.fixed ? (a.style.position = "fixed", c.orien(a, 1)) : (a.style.position = "absolute", c.orien(a))
170     }, c.viewtb = function () {
171         var a, b = [], f = ["日", "一", "二", "三", "四", "五", "六"], h = {}, i = d[e]("table"), j = d[e]("thead");
172         return j.appendChild(d[e]("tr")), h.creath = function (a) {
173             var b = d[e]("th");
174             b.innerHTML = f[a], j[g]("tr")[0].appendChild(b), b = null
175         }, c.each(new Array(6), function (d) {
176             b.push([]), a = i.insertRow(0), c.each(new Array(7), function (c) {
177                 b[d][c] = 0, 0 === d && h.creath(c), a.insertCell(c)
178             })
179         }), i.insertBefore(j, i.children[0]), i.id = i.className = "laydate_table", a = b = null, i.outerHTML.toLowerCase()
180     }(), c.view = function (a, f) {
181         var i, g = c.query, j = {};
182         f = f || a, c.elem = a, c.options = f, c.options.format || (c.options.format = b.format), c.options.start = c.options.start || "", c.mm = j.mm = [c.options.min || b.min, c.options.max || b.max], c.mins = j.mm[0].match(/\d+/g), c.maxs = j.mm[1].match(/\d+/g), h.elemv = /textarea|input/.test(c.elem.tagName.toLocaleLowerCase()) ? "value" : "innerHTML", c.box ? c.shde(c.box) : (i = d[e]("div"), i.id = h[0], i.className = h[0], i.style.cssText = "position: absolute;", i.setAttribute("name", "laydate-v" + laydate.v), i.innerHTML = j.html = '<div class="laydate_top"><div class="laydate_ym laydate_y" id="laydate_YY"><a class="laydate_choose laydate_chprev laydate_tab"><cite></cite></a><input id="laydate_y" readonly><label></label><a class="laydate_choose laydate_chnext laydate_tab"><cite></cite></a><div class="laydate_yms"><a class="laydate_tab laydate_chtop"><cite></cite></a><ul id="laydate_ys"></ul><a class="laydate_tab laydate_chdown"><cite></cite></a></div></div><div class="laydate_ym laydate_m" id="laydate_MM"><a class="laydate_choose laydate_chprev laydate_tab"><cite></cite></a><input id="laydate_m" readonly><label></label><a class="laydate_choose laydate_chnext laydate_tab"><cite></cite></a><div class="laydate_yms" id="laydate_ms">' + function () {
183                 var a = "";
184                 return c.each(new Array(12), function (b) {
185                     a += '<span m="' + b + '">' + c.digit(b + 1) + "月</span>"
186                 }), a
187             }() + "</div>" + "</div>" + "</div>" + c.viewtb + '<div class="laydate_bottom">' + '<ul id="laydate_hms">' + '<li class="laydate_sj">时间</li>' + "<li><input readonly>:</li>" + "<li><input readonly>:</li>" + "<li><input readonly></li>" + "</ul>" + '<div class="laydate_time" id="laydate_time"></div>' + '<div class="laydate_btn">' + '<a id="laydate_clear">清空</a>' + '<a id="laydate_today">今天</a>' + '<a id="laydate_ok">确认</a>' + "</div>" + (b.isv ? '<a href="http://sentsin.com/layui/laydate/" class="laydate_v" target="_blank">laydate-v' + laydate.v + "</a>" : "") + "</div>", d.body.appendChild(i), c.box = g("#" + h[0]), c.events(), i = null), c.follow(c.box), f.zIndex ? c.box.style.zIndex = f.zIndex : c.removeCssAttr(c.box, "z-index"), c.stopMosup("click", c.box), c.initDate(), c.iswrite(), c.check()
188     }, c.reshow = function () {
189         return c.each(c.query("#" + h[0] + " .laydate_show"), function (a, b) {
190             c.removeClass(b, "laydate_show")
191         }), this
192     }, c.close = function () {
193         c.reshow(), c.shde(c.query("#" + h[0]), 1), c.elem = null
194     }, c.parse = function (a, d, e) {
195         return a = a.concat(d), e = e || (c.options ? c.options.format : b.format), e.replace(/YYYY|MM|DD|hh|mm|ss/g, function () {
196             return a.index = 0 | ++a.index, c.digit(a[a.index])
197         })
198     }, c.creation = function (a, b) {
199         var e = (c.query, c.hmsin), f = c.parse(a, [e[0].value, e[1].value, e[2].value]);
200         c.elem[h.elemv] = f, b || (c.close(), "function" == typeof c.options.choose && c.options.choose(f));
201         if (cb) {
202             cb()
203         }
204     }, c.events = function () {
205         var b = c.query, e = {box: "#" + h[0]};
206         c.addClass(d.body, "laydate_body"), h.tds = b("#laydate_table td"), h.mms = b("#laydate_ms span"), h.year = b("#laydate_y"), h.month = b("#laydate_m"), c.each(b(e.box + " .laydate_ym"), function (a, b) {
207             c.on(b, "click", function (b) {
208                 c.stopmp(b).reshow(), c.addClass(this[g]("div")[0], "laydate_show"), a || (e.YY = parseInt(h.year.value), c.viewYears(e.YY))
209             })
210         }), c.on(b(e.box), "click", function () {
211             c.reshow()
212         }), e.tabYear = function (a) {
213             0 === a ? c.ymd[0]-- : 1 === a ? c.ymd[0]++ : 2 === a ? e.YY -= 14 : e.YY += 14, 2 > a ? (c.viewDate(c.ymd[0], c.ymd[1], c.ymd[2]), c.reshow()) : c.viewYears(e.YY)
214         }, c.each(b("#laydate_YY .laydate_tab"), function (a, b) {
215             c.on(b, "click", function (b) {
216                 c.stopmp(b), e.tabYear(a)
217             })
218         }), e.tabMonth = function (a) {
219             a ? (c.ymd[1]++, 12 === c.ymd[1] && (c.ymd[0]++, c.ymd[1] = 0)) : (c.ymd[1]--, -1 === c.ymd[1] && (c.ymd[0]--, c.ymd[1] = 11)), c.viewDate(c.ymd[0], c.ymd[1], c.ymd[2])
220         }, c.each(b("#laydate_MM .laydate_tab"), function (a, b) {
221             c.on(b, "click", function (b) {
222                 c.stopmp(b).reshow(), e.tabMonth(a)
223             })
224         }), c.each(b("#laydate_ms span"), function (a, b) {
225             c.on(b, "click", function (a) {
226                 c.stopmp(a).reshow(), c.hasClass(this, h[1]) || c.viewDate(c.ymd[0], 0 | this.getAttribute("m"), c.ymd[2])
227             })
228         }), c.each(b("#laydate_table td"), function (a, b) {
229             c.on(b, "click", function (a) {
230                 c.hasClass(this, h[1]) || (c.stopmp(a), c.creation([0 | this.getAttribute("y"), 0 | this.getAttribute("m"), 0 | this.getAttribute("d")]))
231             })
232         }), h.oclear = b("#laydate_clear"), c.on(h.oclear, "click", function () {
233             c.elem[h.elemv] = "", c.close()
234             if(cb){
235                 cb();
236             }
237         }), h.otoday = b("#laydate_today"), c.on(h.otoday, "click", function () {
238             c.elem[h.elemv] = laydate.now(0, c.options.format), c.close()
239             if(cb){
240                 cb();
241             }
242         }), h.ok = b("#laydate_ok"), c.on(h.ok, "click", function () {
243             c.valid && c.creation([c.ymd[0], c.ymd[1] + 1, c.ymd[2]])
244         }), e.times = b("#laydate_time"), c.hmsin = e.hmsin = b("#laydate_hms input"), e.hmss = ["小时", "分钟", "秒数"], e.hmsarr = [], c.msg = function (a, d) {
245             var f = '<div class="laydte_hsmtex">' + (d || "提示") + "<span>×</span></div>";
246             "string" == typeof a ? (f += "<p>" + a + "</p>", c.shde(b("#" + h[0])), c.removeClass(e.times, "laydate_time1").addClass(e.times, "laydate_msg")) : (e.hmsarr[a] ? f = e.hmsarr[a] : (f += '<div id="laydate_hmsno" class="laydate_hmsno">', c.each(new Array(0 === a ? 24 : 60), function (a) {
247                 f += "<span>" + a + "</span>"
248             }), f += "</div>", e.hmsarr[a] = f), c.removeClass(e.times, "laydate_msg"), c[0 === a ? "removeClass" : "addClass"](e.times, "laydate_time1")), c.addClass(e.times, "laydate_show"), e.times.innerHTML = f
249         }, e.hmson = function (a, d) {
250             var e = b("#laydate_hmsno span"), f = c.valid ? null : 1;
251             c.each(e, function (b, e) {
252                 f ? c.addClass(e, h[1]) : c.timeVoid(b, d) ? c.addClass(e, h[1]) : c.on(e, "click", function () {
253                     c.hasClass(this, h[1]) || (a.value = c.digit(0 | this.innerHTML))
254                 })
255             }), c.addClass(e[0 | a.value], "laydate_click")
256         }, c.each(e.hmsin, function (a, b) {
257             c.on(b, "click", function (b) {
258                 c.stopmp(b).reshow(), c.msg(a, e.hmss[a]), e.hmson(this, a)
259             })
260         }), c.on(d, "mouseup", function () {
261             var a = b("#" + h[0]);
262             a && "none" !== a.style.display && (c.check() || c.close())
263         }).on(d, "keydown", function (b) {
264             b = b || a.event;
265             var d = b.keyCode;
266             13 === d && c.creation([c.ymd[0], c.ymd[1] + 1, c.ymd[2]])
267         })
268     }, c.init = function () {
269         c.use("need"), c.use(h[4] + b.defSkin, h[3]), c.skinLink = c.query("#" + h[3])
270     }(), laydate.reset = function () {
271         c.box && c.elem && c.follow(c.box)
272     }, laydate.now = function (a, b) {
273         var d = new Date(0 | a ? function (a) {
274             return 864e5 > a ? +new Date + 864e5 * a : a
275         }(parseInt(a)) : +new Date);
276         return c.parse([d.getFullYear(), d.getMonth() + 1, d.getDate()], [d.getHours(), d.getMinutes(), d.getSeconds()], b)
277     }, laydate.skin = function (a) {
278         c.skinLink.href = c.getPath + h[4] + a + h[5]
279     }
280 }(window);
复制代码

上面是改版后的js文件

directive里面这样写

复制代码
.directive('defLaydate', function () {
            return {
                require: '?ngModel',
                restrict: 'A',
                scope: {
                    ngModel: '='
                },
                link: function (scope, element, attr, ngModel) {
                    var _date = null, _config = {};

                    // 初始化参数
                    _config = {
                        elem: '#' + attr.id,
                        format: attr.format != undefined && attr.format != '' ? attr.format : 'YYYY-MM-DD',
                        max: attr.hasOwnProperty('maxDate') ? attr.maxDate : '',
                        min: attr.hasOwnProperty('minDate') ? attr.minDate : '',
                        choose: function (data) {
                            scope.$apply(setViewValue);

                        },
                        clear: function () {
                            ngModel.$setViewValue(null);
                        }
                    };
                    // 初始化
                    // _date = laydate(_config);

                    element.on('click', function () {
                        laydate('',function () {
                            scope.$apply(setViewValue);
                        });
                    })
                    // 模型值同步到视图上
                    ngModel.$render = function () {
                        element.val(ngModel.$viewValue || '');
                    };

                    // 监听元素上的事件
                    /*element.on('blur keyup change input', function () {
                        scope.$apply(setViewValue);
                    });*/

                    setViewValue();

                    // 更新模型上的视图值
                    function setViewValue() {
                        var val = element.val();
                        ngModel.$setViewValue(val);
                    }
                }
            }
        })
复制代码

html文件样式如下

<input type="text" ng-model="tmFund.startTime" id="tmAllStart" def-laydate />

ID必须唯一

posted @   love_飞影  阅读(7)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示