以下内容是关于 art-template 过滤器里的参数以及执行顺序的测试
//node 一个测试函数
template.defaults.imports.$test1 = function(){
console.log(arguments)
return 1
}
//art
//第一种情况
{{ '123' | $test1 }}
// 编译结果 : 1
// 终端输出: {"0":"123"}
//第二种情况
{{ $test1 '123' }}
// 编译结果 : 1
// 终端输出: {"0":"123"}
//第三种情况
{{ '321' |$test1 '123' }}
// 编译结果 : 1
// 终端输出: {"0":"321","1":"123"}
//报错
1.{{ '111' '22' | $test1 '222' }}
2.{{ '111' | $test1 '222' '333'}}
3.{{ obj | $test1 obj.key}} //obj为一个对象
...
//不报错
1.{{ ['111','22'] | $test1 '222' }}
// 终端输出: {"0":["111","22"],"1":"222"}
2.{{ '111' | $test1 ['222','333']}}
// 终端输出: {"0":"111","1": ['222','333']}
3.{{ obj.key | $test1 obj }} //obj为一个对象
// 终端输出: {"0":obj.key,"1":obj}
...
从上面可以看出,可以写参数的位置有两个,并且如果有多个,那必须写成数组或对象的形式.
特殊点,第一个位置的参数,可以使用对象打点取值的方式,但是第二个位置的参数这样写或报错
//node 两个测试函数
template.defaults.imports.$test1 = function(){
console.log(1);
console.log(arguments)
return 1
}
template.defaults.imports.$test2 = function(){
console.log(2);
console.log(arguments);
return 2
}
//art
//第一种情况
{{ '123' | $test1 | $test2 }}
//模板输出 2
//终端输出
// 1 {"0":'123' }
// 2 {"0": 1 }
//第二种情况
{{ '123' | $test1 'test1'| $test2 'test2' }}
//模板输出 2
//终端输出
//1 {"0":"123","1":"test1"}
//1 {"0":1,"1":"test2"}
//第三种情况 把$test1的return 1注释
{{ '123' | $test1 'test1'| $test2 'test2' }}
//模板输出 2
//终端输出
//1 {"0":"123","1":"test1"}
//1 {"0":undefined,"1":"test2"}
从上可以看出,运行顺序为从左往右运行,且test2的第一个参数,为test1的返回值,当test1没有返回值,但是test2在后面的位置添加了一个参数,在输出参数的时候第一个参数为undefined
,也就是说,当指定了后面的参数,且前面的参数为undefined
的时候.在传进函数时,参数的值为[undefined,arg2]
//第四种情况
{{ $test1 'test1' | $test2 'test2'}}
//报错
//第五种情况
{{ $test1 | $test2 'test2'}}
//终端输出
//{'0':[Function],'1':'test2'}
从第四种可以看出,在没有给第一个函数的第一个参数指定位置时,给了第二个位置的参数,会报错,报错原因为missing }after argument list
,也就是说系统把$test1
和'test1'
当成了两个参数来处理.
在第五种情况中,同第四种的处理,把$test1
当成了参数,传到了$test2
中