5.4 消除template模板对外部变量名的依赖
来看一个有趣儿的问题。我们之前讲过,列表渲染中wx:for-item可以指定数组子元素的变量名。现在,尝试将代码清单5-6中的wx:for-item="item"改成wx:for-item="item1"。这将使postList数组子元素的变量名由item变成item1。
此时,如果要将数据传入到postItemTpl中,则应该设置data="item1"。
做完以上变更后,再次保存运行代码,会发现文章数据将消失,并且没有任何错误提示。没有显示数据,肯定是有问题的,再次强调很多时候数据绑定的相关问题,小程序不会做任何的错误提示。
那么,问题出在什么地方?之前代码可以正常运行是因为我们向template传入的变量名data="{{item}}",恰好和template里面数据绑定的变量名item一样,开发者可以回顾一下代码清单5-5和代码清单5-6。但一旦更改了item为item1后,template就找不到这个item了。
类比一下函数,函数的参数名是可以由函数自己自定义的,这保证了函数不受外部变量名的影响。但是template模板却并没有提供一个定义参数名的地方,没有办法更改从外部传入的item1为item。
当然,可以通过将postItemTpl这个template内部的item更改为item1来让代码重新正常运行,开发者可以自行尝试一下。
但这并不是一个好的办法,看起它非常的蠢。我们讲过模板的好处是它可以让多个调用方来调用,不可能要求每个调用方都使用同样的变量名来调用模板,这种由定义方要求调用方遵守变量名命名的做法是不太合理的。
要解决这个问题,就必须消除template对于外部变量名的依赖,可以使用扩展运算符“...”展开传入对象变量来消除这个问题。
将post.wxml中使用模板的地方更改为:
接着去掉post-item-tpl.wxml文件中{{}}里所有的item。
保存并运行,文章列表可以正常显示了。
{{...item}}可以将item这个对象展开。展开之后再传入到template里,就可以保证template不再依赖item这个变量名。