|
|
@@ -1,6 +1,5 @@
|
|
|
var utils = require('./utils'),
|
|
|
directives = require('./directives'),
|
|
|
- filters = require('./filters'),
|
|
|
|
|
|
// Regexes!
|
|
|
|
|
|
@@ -21,11 +20,13 @@ var utils = require('./utils'),
|
|
|
* Directive class
|
|
|
* represents a single directive instance in the DOM
|
|
|
*/
|
|
|
-function Directive (definition, expression, rawKey, compiler, node) {
|
|
|
+function Directive (dirname, definition, expression, rawKey, compiler, node) {
|
|
|
|
|
|
- this.compiler = compiler
|
|
|
- this.vm = compiler.vm
|
|
|
- this.el = node
|
|
|
+ this.name = dirname
|
|
|
+ this.compiler = compiler
|
|
|
+ this.vm = compiler.vm
|
|
|
+ this.el = node
|
|
|
+ this.computeFilters = false
|
|
|
|
|
|
var isEmpty = expression === ''
|
|
|
|
|
|
@@ -55,20 +56,32 @@ function Directive (definition, expression, rawKey, compiler, node) {
|
|
|
).trim()
|
|
|
|
|
|
parseKey(this, rawKey)
|
|
|
-
|
|
|
- this.isExp = !SINGLE_VAR_RE.test(this.key) || NESTING_RE.test(this.key)
|
|
|
|
|
|
var filterExps = this.expression.slice(rawKey.length).match(FILTERS_RE)
|
|
|
if (filterExps) {
|
|
|
this.filters = []
|
|
|
for (var i = 0, l = filterExps.length, filter; i < l; i++) {
|
|
|
filter = parseFilter(filterExps[i], this.compiler)
|
|
|
- if (filter) this.filters.push(filter)
|
|
|
+ if (filter) {
|
|
|
+ this.filters.push(filter)
|
|
|
+ if (filter.apply.computed) {
|
|
|
+ // some special filters, e.g. filterBy & orderBy,
|
|
|
+ // can involve VM properties and they often need to
|
|
|
+ // be computed.
|
|
|
+ this.computeFilters = true
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
if (!this.filters.length) this.filters = null
|
|
|
} else {
|
|
|
this.filters = null
|
|
|
}
|
|
|
+
|
|
|
+ this.isExp =
|
|
|
+ this.computeFilters ||
|
|
|
+ !SINGLE_VAR_RE.test(this.key) ||
|
|
|
+ NESTING_RE.test(this.key)
|
|
|
+
|
|
|
}
|
|
|
|
|
|
var DirProto = Directive.prototype
|
|
|
@@ -102,7 +115,7 @@ function parseFilter (filter, compiler) {
|
|
|
})
|
|
|
|
|
|
var name = tokens[0],
|
|
|
- apply = compiler.getOption('filters', name) || filters[name]
|
|
|
+ apply = compiler.getOption('filters', name)
|
|
|
if (!apply) {
|
|
|
utils.warn('Unknown filter: ' + name)
|
|
|
return
|
|
|
@@ -128,7 +141,7 @@ DirProto.update = function (value, init) {
|
|
|
this.value = value
|
|
|
if (this._update) {
|
|
|
this._update(
|
|
|
- this.filters
|
|
|
+ this.filters && !this.computeFilters
|
|
|
? this.applyFilters(value)
|
|
|
: value,
|
|
|
init
|
|
|
@@ -192,7 +205,7 @@ Directive.parse = function (dirname, expression, compiler, node) {
|
|
|
|
|
|
// have a valid raw key, or be an empty directive
|
|
|
return (rawKey || expression === '')
|
|
|
- ? new Directive(dir, expression, rawKey, compiler, node)
|
|
|
+ ? new Directive(dirname, dir, expression, rawKey, compiler, node)
|
|
|
: utils.warn('invalid directive expression: ' + expression)
|
|
|
}
|
|
|
|