表单初始赋值失败

提问 已结 13 202
奋斗的小公鸡
悬赏:200飞吻
版本:layui 最新 浏览器:火狐
今天又被一个小问题给搞死了 现在应该猜到大概是什么问题 哪个layui获取的data它不是标准的js对象

求解释layui拿到的是什么类型的数据 根据调试工具得出该类型和MIME有关系 但是不知道MIME和layui到底有什么关系 刚刚特意冲了10快学生党飞吻不多见谅
回帖
  • @奋斗的小公鸡 嗯,传的是对象那就是另外一个问题了,可以看看我之前的一个帖子 关于layui.each在iframe中的应用出现的问题 ,实际是因为layui.each内部的逻辑问题导致的所以要先深拷贝一份然后再去val,大概如下:
    // 直接用父窗口的对象变量去赋值无效,因为目前layui.each的逻辑问题
    form.val('test_form', $.extend(window.parent.dataSub||{}));
    // 深拷贝一份就可以
    form.val('test_form', $.extend({}, window.parent.dataSub||{}));
    1 回复
  • 源码是最好的文档,要学会看懂别人代码的意思,自然的就会知道更多的东西,而不用猜,实际文档还有举的例子也很清楚了,form.val()的方法有两个参数,第一个是你要往哪个form赋值对应的就是这个.layui-form上面的lay-filter的值,所以第一个参数你使用的应该是对的,第二个参数就是一个object,他不是说什么类型都可以的,不是说你传进去一个json字符串,他里面会给你解析成一个json对象,太折腾了,所以如果你的paent.parent1本身就是一个对象,那么直接作为第二个参数就可以了,不要转成json字符串,字符串只会更加错,关键是你之前是不是遇到了没有转字符串直接对象也不行才转成字符串的。
    0 回复
  • @岁月小偷 不好意思哈 我传的就是没有转字符串的 截图出错 我传的是对象
    0 回复
  • 83行我截图有误 我解析出来只是为了打印给大家看 下面忘记改了 所有才搞死了我 明明传的是对象 但是后面发现对象其实也有类型的 比如json对象和js原生对象在格式是有区别 但是使用无区别 格式上的区别是json的键外面有双引号而js对象键没有引号,如{“name”:"xxx"},{name:"xxx"} 而layui又搞出了一种类型 基本用法dom取值没问题 但是这种情况就不可以 我想搞清楚机制
    0 回复
  • Zlheb
    2019-5-21
    这只要是一个标准的json对象就可以,不管是自己创建的对象 var obj={name:'123'} 还是后台返回的json数据,只要能成功解析为json对象都是可以赋值的,layui没有创建一种新类型,也没有那么大的能力说创建一种 js 类型


    0 回复
  • Zlheb
    2019-5-21
    你输出的数据是没问题,但那是经过序列化的,那叫json字符串,不是json对象,如果数据本身就是json对象那是不需要做任何操作就可以直接赋值的,如果是json字符串需要用JSON.parse(jsonStr);转换成对象再赋值
    0 回复
  • @Zlheb 你好我图片的83行打错了 我没有转字符串类型也没有效果 转字符串的目的只是调试
    0 回复
  • @岁月小偷 不好意思我小白看不懂你的代码 比如和 哪个===Object 是什么意思 什么情况会返回true呢 但是通过您的贴子 我突破的我的问题 js对象分js原生对象和dom对象 form.val()第二个参数只支持js原生对象 所以就失效了
    0 回复
  • @奋斗的小公鸡 是有原生对象和DOM对象,但是跟你这个问题没有关系额,本来你从父窗口取过来的数据也是一个js对象,所以关键点不是那个对象是原生对象还是DOM对象,而是关乎到layui.each的这个内部逻辑,可能你会觉得你是用的form.val,跟layui.each有啥关系,实际在那个帖子里面说了,form.val中最关键的代码之一就是利用layui.each遍历第二个参数,将表单中对应的表单元素给赋值,layui.each可以遍历jquery对象,也可以遍历obj,也可以遍历数组,那么怎么区分是obj和数组,里面用到的就是判断这个数据的原型是否等于Object,但是(个人理解)对象是从父窗口拿过来的,他的原型是Object,但是不是当前窗口的Object,所以导致了即使原型是Object也不等于当前窗口的Object,这个可以等同的理解为{a: 1} !== {a: 1}差不多道理,进而他就不认为each里面要遍历的是一个对象,而是其他的,结果其他的也判断不出来什么,等于each就什么也没做成了,进而form.val也就没有达到预期的目标了。
    0 回复
  • Zlheb
    2019-5-22
    object和object是不能进行比较的,即使内容一模一样他们都是不相等的,因为他们是引用类型,只有值类型可以比较 如 1===1 '1'==='1' 前端的话叫原型指针,后端的话叫内存堆栈(内存地址)
    0 回复