一名Android开发者的微信小程序填坑之路(2)

转载地址: http://blog.youkuaiyun.com/luoyanglizi/article/details/52797856

6,后台接收 post 请求要表单?

首先问题是:我要向后台 post 一些数据,但是后台需要接收一个表单,我应该怎样获得一个表单或者将本地的数据转换成一个表单呢?

在写 wechat-weapp-gank 的提交干货模块的时候,我就遇到了这个问题。一开始我挺纳闷的,明明是把后台需要的数据都给传过去了,结果后台老是跟我说我的数据不对,后来我才发现是因为后台那边要求接收一个表单,而我传过去的是一个 json 数据。于是我就开始了漫长的探索之旅。(就为了这一个问题,从晚上十一点多一直搞到第二天凌晨四点多。。。如果不是有一个群里有个老司机帮忙说不定就死在这个问题上了)

首先我想的是能不能把现成的 json 数据直接转化为 form 表单?因为我已经完成了获取要输的信息然后把它变成了 json 数据的工作,如果能直接把 json 对象转化为 form 对象的话我需要对程序做的改动肯定是最小的。然而遗憾的是,似乎并没有可行的方案。(也有可能是因为我 js 功底太差吧,我确实是没有找到相应的方法,要生成一个 form 似乎是需要 document 的,而小程序中我们并不能够得到它)

此路不通,另觅他途。在查阅资料的过程中,我发现在 HTML 中似乎是有 这个标签的,然后我就兴冲冲的又去翻阅了一下小程序的官方文档,果不其然,小程序还是很良心的,有这方面的描述:

form

然后我就兴冲冲的去按照官方的介绍用 标签来提交数据,js 里的代码是这样的:

formSubmit: function (event) {
        wx.request({
            url: Constant.BASE_URL + "/add2gank",
            method: "POST",
            //按照官方文档,event.detail.value应该就是 <form> 标签获得的数据
            data: event.detail.value,
            complete: function (res) {
                  //省略
            }
        });
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

我满心欢喜的以为可以了,结果并不可以。。。后台还是跟我说获得的数据有问题,结果我 console.log() 了看 给我返回的数据,它竟然还是个 json 。。。说好的 form 呢!感觉受到了欺骗。

濒临崩溃。幸好这时候一个老司机点醒了我:为啥那么纠结在本地数据是什么样子的?归根结底我们是要把数据传到后台去,那么只需要让数据在请求里面是 form 的格式不就 OK 了?所以 form 表单在请求里面是长什么样子的呢?

json数据:
{name: "lypeer",  gender: "男"}
form数据:
"name=lypeer & gender=男"
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

所以只要直接对数据进行操作,不用去管什么鬼 json 对象 form 对象什么的,那位老司机写了个方法,我无耻的直接拿来用了:

function json2Form(json) {
    var str = [];
    for(var p in json){
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(json[p]));
    }
    return str.join("&");
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

ok,然后就可以用这个方法转换数据后来 post 一发:

formSubmit: function (event) {
        console.log(event);
        wx.request({
            url: Constant.BASE_URL + "/add2gank",
            header: {
                "Content-Type": "application/x-www-form-urlencoded"
            },
            method: "POST",
            data: Util.json2Form(event.detail.value).concat("&debug=false"),

            complete: function (res) {
                //省略
            }
        });
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

这里有一点需要注意,必需修改 content-Type 为 application/x-www-form-urlencoded ,不然还是会出问题。

通过上面的方式就可以愉快的给后台传表单啦~~~另外关于 这个标签,虽然说他不会直接给我们返回 form 表单,但是我感觉它还是很好用的,可以直接获得里面的很多信息,不用很麻烦的一个一个去获取数据了。不过这个标签也是有一些坑的,下面会讲到它。

7,解析 HTML 代码块?

有时候我们会有解析 HTML 代码块的需求(爬了一个网页需要解析,或者后台出于某种原因返回给你了一个 HTML 代码块),但是我们能获得的通常是一个 String 值( json 里返回的),在这种情况下通常我们会想到两种解析方式:直接使用正则匹配字符串或者将其装化成一个 DOM(Document Object Model,文档对象模型,没怎么接触过 JS 的同学可能对这个不太清楚) 然后解析。

直接使用正则的方式这里我就不具体说了,这玩意儿在有些时候还是很好用的,但是在有些时候不那么方便,毕竟它不是为了解析 HTML 而生的。而一提到转化为 DOM , 大家的脑海里就会浮现出这行代码来:

var el = document.createElement( 'html' );
el.innerHTML = htmlString;//htmlString是一串 HTML 代码的 String 值
 
  • 1
  • 2
  • 1
  • 2

再然后就可以对 el 执行一系列的解析操作了:

el.getElementById( idName );
el.getElementsByTagName( tagName );
......
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

毫无疑问,这种方式在大多数情况下是比正则来的简单方便的,毕竟你不需要绞尽脑汁去写合适的正则表达式了。那么问题来了,在小程序里面我们无法直接获得 window 和 document 对象,那么如何把一段 HTML 代码的 String 值转化为 DOM 呢?不知道那些前端老司机是怎么做的,反正我是这么做的:

function parseHtml(htmlBlock) {
        var parser = new DOMParser();
        return parser.parseFromString(htmlBlock, "text/html");
}
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

我惊讶的发现,虽然微信小程序里面没有 ducument , window 的概念,但是可以通过 DOMParser 对象来获得一个 document 对象 ……不要问我怎么发现的,这里面的艰辛不足为外人道也。

然后我们就可以愉快的通过这个返回的对象来进行一系列解析操作啦~~~

8,<form/> 里面无法获取 <picker/> 的取值?

在微信小程序的官方文档里,是指明了 <form/> 标签里可以提交 <picker/> 的数据的,但是如果你真的在 <form/> 标签里放了一个<picker/> 的话,你会发现,童话里都是骗人的。什么鬼!说好的数据呢!!!死活都获取不了数据,甚至还会让整个程序崩掉。并且坑爹的是,在小程序官网上面的那个 DEMO 里面,关于 <form/> 标签的使用有一个例子,例子里面几乎包含了 <form/> 标签中会提取数据的所有控件,就是没有 <picker/> 。

啊?

那怎么办?这当然是难不倒我的。最终我采取了这样的方式来解决这个问题:

<picker bindchange="onPickerChanged" value="{{index}}" range="{{array}}">
        <input class="picker" disabled="disabled" name="type" value="{{array[index]}}"/>
</picker>
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这是一个 <form/> 标签里面的 <picker/> 标签,我采取的方式是用一个 <input/> 标签来获取 <picker/> 的值,然后让 <form/>获取 <input/> 的值,从而达到将 <picker/> 里面的值传递给 <form/> 的目的。

9,要实现多层列表?

在做 wechat-weapp-gank 的每天干货展示的页面的时候,有一个这样的页面需要实现:

多层列表

这个东西说白了就是个两层的列表,在原先做 Android 的时候这个是很容易的,直接嵌套嘛,但是现在做小程序的这个效果还是遇到了一些问题。这其中最大的问题就是在嵌套的过程中究竟在绑定数据的时候应该怎么写——第二个列表应该怎么传数据进去呢?第二个列表的列表项应该怎么获取数据呢?最后我摸索出来的结果是这样的:

<view class="frame" wx:for="{{data}}">
        <view class="tag">{{item.tag}}</view>
        <view wx:for="{{item.singleItems}}">
                <view class="singleItem" href="{{item.src}}">{{index}}{{item.title}}</view>
        </view>
</view>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其中 data 是一个数组,它里面装的是一个一个的的 json 数据,每个 json 数据里面又装了 tagsingleItems 等数据,其中singleItems 又是一个数组,它里面装的也是一个一个的 json 数据,每个 json 数据里装了每个二级列表的 item 所需的数据。

具体的可以去我的项目代码里去看,具体的代码路径在这里:post.wxml 和 post.js

10,如何方便愉快的实现类似 Java 里面的静态变量的效果?

这点的话纯粹是我的一点执念吧,我是从事 Android 开发的,也有点开发中的小癖好,喜欢把一些字符串弄成全局静态的放到一个专门的地方去。如果是在 Java 里面的话,我喜欢这样做:

然后在调用的时候就可以这样做:

String appId = Constants.AppSign.V_APP_ID;
 
  • 1
  • 1

这样做我觉得很舒服,条理很清晰。但是在微信小程序中想要得到这样的体验就很困难——不过还是让我找到了方法——在小程序里面,是可以通过 module.exports 将一个 js 文件模块化,然后让别的 js 文件通过 require( URL ) 引用的,我们可以通过这个特性来实现字符串的全局化,像这样:

全局化

这样的话,我们就可以在需要使用的时候这样:

使用

这个其实不算踩过的坑哈,只是一个 Android 程序员的小执念而已,大家可以无视。。。


内容概要:本文详细介绍了一种基于Simulink的表贴式永磁同步电机(SPMSM)有限控制集模型预测电流控制(FCS-MPCC)仿真系统。通过构建PMSM数学模型、坐标变换、MPC控制器、SVPWM调制等模块,实现了对电机定子电流的高精度跟踪控制,具备快速动态响应和低稳态误差的特点。文中提供了完整的仿真建模步骤、关键参数设置、核心MATLAB函数代码及仿真结果分析,涵盖转速、电流、转矩和三相电流波形,验证了MPC控制策略在动态性能、稳态精度和抗负载扰动方面的优越性,并提出了参数自整定、加权代价函数、模型预测转矩控制和弱磁扩速等优化方向。; 适合人群:自动化、电气工程及其相关专业本科生、研究生,以及从事电机控制算法研究与仿真的工程技术人员;具备一定的电机原理、自动控制理论和Simulink仿真基础者更佳; 使用场景及目标:①用于永磁同步电机模型预测控制的教学演示、课程设计或毕业设计项目;②作为电机先进控制算法(如MPC、MPTC)的仿真验证平台;③支撑科研中对控制性能优化(如动态响应、抗干扰能力)的研究需求; 阅读建议:建议读者结合Simulink环境动手搭建模型,深入理解各模块间的信号流向与控制逻辑,重点掌握预测模型构建、代价函数设计与开关状态选择机制,并可通过修改电机参数或控制策略进行拓展实验,以增强实践与创新能力。
根据原作 https://pan.quark.cn/s/23d6270309e5 的源码改编 湖北省黄石市2021年中考数学试卷所包含的知识点广泛涉及了中学数学的基础领域,涵盖了实数、科学记数法、分式方程、几何体的三视图、立体几何、概率统计以及代数方程等多个方面。 接下来将对每道试题所关联的知识点进行深入剖析:1. 实数与倒数的定义:该题目旨在检验学生对倒数概念的掌握程度,即一个数a的倒数表达为1/a,因此-7的倒数可表示为-1/7。 2. 科学记数法的运用:科学记数法是一种表示极大或极小数字的方法,其形式为a×10^n,其中1≤|a|<10,n为整数。 此题要求学生运用科学记数法表示一个天文单位的距离,将1.4960亿千米转换为1.4960×10^8千米。 3. 分式方程的求解方法:考察学生解决包含分母的方程的能力,题目要求找出满足方程3/(2x-1)=1的x值,需通过消除分母的方式转化为整式方程进行解答。 4. 三视图的辨认:该题目测试学生对于几何体三视图(主视图、左视图、俯视图)的认识,需要识别出具有两个相同视图而另一个不同的几何体。 5. 立体几何与表面积的计算:题目要求学生计算由直角三角形旋转形成的圆锥的表面积,要求学生对圆锥的底面积和侧面积公式有所了解并加以运用。 6. 统计学的基础概念:题目涉及众数、平均数、极差和中位数的定义,要求学生根据提供的数据信息选择恰当的统计量。 7. 方程的整数解求解:考察学生在实际问题中进行数学建模的能力,通过建立方程来计算在特定条件下帐篷的搭建方案数量。 8. 三角学的实际应用:题目通过在直角三角形中运用三角函数来求解特定线段的长度。 利用正弦定理求解AD的长度是解答该问题的关键。 9. 几何变换的应用:题目要求学生运用三角板的旋转来求解特定点的...
Python基于改进粒子群IPSO与LSTM的短期电力负荷预测研究内容概要:本文围绕“Python基于改进粒子群IPSO与LSTM的短期电力负荷预测研究”展开,提出了一种结合改进粒子群优化算法(IPSO)与长短期记忆网络(LSTM)的混合预测模型。通过IPSO算法优化LSTM网络的关键参数(如学习率、隐层节点数等),有效提升了模型在短期电力负荷预测中的精度与收敛速度。文中详细阐述了IPSO算法的改进策略(如引入自适应惯性权重、变异机制等),增强了全局搜索能力与避免早熟收敛,并利用实际电力负荷数据进行实验验证,结果表明该IPSO-LSTM模型相较于传统LSTM、PSO-LSTM等方法在预测准确性(如MAE、RMSE指标)方面表现更优。研究为电力系统调度、能源管理提供了高精度的负荷预测技术支持。; 适合人群:具备一定Python编程基础、熟悉基本机器学习算法的高校研究生、科研人员及电力系统相关领域的技术人员,尤其适合从事负荷预测、智能优化算法应用研究的专业人士。; 使用场景及目标:①应用于短期电力负荷预测,提升电网调度的精确性与稳定性;②为优化算法(如粒子群算法)与深度学习模型(如LSTM)的融合应用提供实践案例;③可用于学术研究、毕业论文复现或电力企业智能化改造的技术参考。; 阅读建议:建议读者结合文中提到的IPSO与LSTM原理进行理论学习,重点关注参数优化机制的设计思路,并动手复现实验部分,通过对比不同模型的预测结果加深理解。同时可拓展尝试将该方法应用于其他时序预测场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值