一个可复用的组件,内部只专注实现自己关注的逻辑,并提供配置能力,使得自己不关注但是依赖的部分可以由外部进行配置。
要使得一个template便于复用,首先,要规划好该template的职责,并严格约束。比如,要制作一个搜索栏,只关注样式,可以输入,可以提交,而不关注的地方就不要硬编码死,应该交给外部配置,或者提供恰当的默认配置同时提供修改配置的能力,比如,button的内容,提交之后要做的事。
那么如何让外部可以配置template呢?无论从外部的template或从router调用我们的template,都可以附带地传递data(或称data context),可以利用这个机制来实现template的外部配置。
我的具体方案如下:
对于一个可复用的template,首先要有一个单独的目录<name>,其下典型地有3个文件,分别是<name>.html(模板文件),<name>.js(设置helpers和events),README.md(描述功能、接口,也即,告知调用者可以传递那些参数,如何配置这个模板,效果如何)
所有的依赖假设为这个模板的数据环境,在html中,直接用{{变量名}}来引用,在helper和event中,用this.<name>或this.data.<name>来引用依赖。
特别地,如果依赖的是一个函数,那么需要用创建一个代理函数来调用目标函数。如举例的搜索栏,若其‘submit form‘事件由外部确定,名称为submitFunc,那么在设置它的时候,代码如下: ‘submit form‘: function() { return this.submitFunc.applay(this, arguments); }
如此,当一个可复用template完成后,外部调用的时候,将配置对象当作data传入即可。例如,若名为search的template要被另一个名为test的template引用,那么test需要配置search,具体方法为,在test的helper中添加一项searchConfig,其值为按照search的约定构成的配置对象,然后在test的template中使用如下代码即可{{> search searchConfig}}。