时间:2019-05-03 来源:小程序工厂
L***:
你好,微信小程序使用标准的JS引擎,微信小程序本身也不对JS语法相关的问题进行任何特殊处理。
我没完全明白你的问题。但这里可以说明的是,按照你说明中第2点的逻辑,应该是每次页面load的时候会执行一次插件构造器,并传入Page对象。当A、B两个页面构造的时候,会分别创建两个对象,分别拥有两个页面的this。你这里似乎没有表述清楚plugin变量的作用范围,若plugin变量是文件级的,那如果A、B两个页面都对应到这个Page上的话,那确实是会有相互覆盖的情况(类似于普通的require模式,Page所在的JS文件永远只会被执行一次)。这是符合JS语法的,你需要用别的方法规避这个问题。
龙***:
一般要写成一个插件确实都会写在单独一个js给不用页面进行调用,我在web端写plugin构造函数外面会套上一个(function(){})();,微信小程序一般也是require进去的所以外面那层闭包一般就被我偷懒了。我前期也料到可能会有不可控的因素,所以也要求几个同事把页面调用的所有插件的实例化都写在Page的一个固定的方法initPlugin()里面,其实现在相当于在onLoad和onShow都需要去执行这个方法。
我在公司是可以让同事都按照这种模式写,但是有一天我想把我写的插件开源出去的话我总不能告诉人们因为微信小程序的机制是这样的所以就得这么写吧。微信小程序有比require更好的引入js机制,或者有更好的传入Page对象的this的机制麻烦赐教。
L***:
首先我还是没有完全明白你的问题。我就说说如果让我写我会怎么写吧。
假定插件是在文件plugin.js里面的:
var createPluginInstance = require('plugin.js')
Page({
onLoad: function(){
this.plugin = createPluginInstance() // 创建一个插件实例
},
someFunction: function(){
this.plugin.xxx() // 调用插件
}
})
这样不就可以了吗?
龙***:
比如我们现在如果要做一个比较成型的插件肯定是不止写一个js而已,肯定会包括wxml,wxss,plugin.js这三个文件的配套,用户用的时候直接include wxml,@import wxss,require plugin.js,然后实例化构造函数,搞定。
打个比方,现在如果要写一个简单的对话框,那么至少要有一个关掉对话框的事件,例如下面是它的wxml:
这里面有个事件closeDialog,所以在Page()里面肯定要有一个对应的closeDialog()方法,对于相对比较大型插件来说bindtap的方法肯定是非常多,总不能用户要用你的插件还要自己去Page()里面自己写一堆方法吧,所以这些乱七八糟的方法就需要往plugin.js内部封装进去。就拿这个简单的对话框来说吧,他的plugin.js如下: