diff --git a/packages/uni-template-compiler/__tests__/compiler-extra.spec.js b/packages/uni-template-compiler/__tests__/compiler-extra.spec.js
index 3cee2701ba60c753a38839e25320f6e31ca7a954..c06045891f31136fcbf4b3c108fd7e498fbf60b2 100644
--- a/packages/uni-template-compiler/__tests__/compiler-extra.spec.js
+++ b/packages/uni-template-compiler/__tests__/compiler-extra.spec.js
@@ -702,5 +702,10 @@ describe('mp:compiler-extra', () => {
'{{item.m0}}',
'with(this){var l0=__map(list,function(item,index){var $orig=__get_orig(item);var m0=item.length?getValue(item):null;return{$orig:$orig,m0:m0}});$mp.data=Object.assign({},{$root:{l0:l0}})}'
)
+ assertCodegen(
+ '{{getValue(item)}}',
+ '{{item.m0}}',
+ 'with(this){var l0=__map(list,function(item,index){var $orig=__get_orig(item);var m0=item.length>0?getValue(item):null;return{$orig:$orig,m0:m0}});$mp.data=Object.assign({},{$root:{l0:l0}})}'
+ )
})
})
diff --git a/packages/uni-template-compiler/lib/script/traverse/member-expr.js b/packages/uni-template-compiler/lib/script/traverse/member-expr.js
index c8a42dd7fd33b20f2af9035d28868c092a9438c9..f24b487ceb7135e3e5cef21633c1b90a0dbc7b6e 100644
--- a/packages/uni-template-compiler/lib/script/traverse/member-expr.js
+++ b/packages/uni-template-compiler/lib/script/traverse/member-expr.js
@@ -2,7 +2,9 @@ const t = require('@babel/types')
const traverse = require('@babel/traverse').default
const {
- VAR_ROOT
+ VAR_ROOT,
+ IDENTIFIER_METHOD,
+ IDENTIFIER_FILTER
} = require('../../constants')
function isMatch (name, forItem, forIndex) {
@@ -42,15 +44,29 @@ function findTest (path, state) {
let tests
while (path.parentPath && path.key !== 'body') {
if (path.key === 'consequent' || path.key === 'alternate') {
- let test = t.arrayExpression([t.clone(path.container.test)])
+ const testOrig = path.container.test
+ let test = t.arrayExpression([t.cloneDeep(testOrig)])
traverse(test, {
noScope: true,
- MemberExpression (path_) {
+ MemberExpression (memberExpressionPath) {
const names = state.scoped.map(scoped => scoped.forItem)
- const node = path_.node
+ const node = memberExpressionPath.node
const objectName = node.object.name
- if (objectName === VAR_ROOT || (names.includes(objectName) && path.scope.hasOwnBinding(node.property.name))) {
- path_.replaceWith(node.property)
+ const property = node.property
+ const propertyName = property.name
+ if (objectName === VAR_ROOT || (names.includes(objectName) && (propertyName === IDENTIFIER_METHOD || propertyName === IDENTIFIER_FILTER))) {
+ let property
+ traverse(testOrig, {
+ noScope: true,
+ Identifier (identifierPath) {
+ const node = identifierPath.node
+ if (node.name === propertyName) {
+ property = node
+ identifierPath.stop()
+ }
+ }
+ })
+ memberExpressionPath.replaceWith(property)
}
}
})