diff --git a/lib/core/renderer.js b/lib/core/renderer.js
index aecdcb6..7f8e179 100644
--- a/lib/core/renderer.js
+++ b/lib/core/renderer.js
@@ -2584,9 +2584,10 @@ Renderer.setMethod(function applyElementOptions(element, options, for_sync_rende
let event_handlers = [];
for (let hook of options.hooks) {
- const name = hook.name;
+ const name = hook.name,
+ domain = hook.domain;
- if (name === 'ref') {
+ if (domain == 'hook' && name === 'ref') {
let value = this.parseRuntimeExpression(hook.value);
if (value) {
@@ -2596,23 +2597,26 @@ Renderer.setMethod(function applyElementOptions(element, options, for_sync_rende
continue;
}
- switch (name) {
- case 'click':
- case 'focus':
- case 'hover':
- case 'blur':
- case 'change':
- case 'input':
- case 'keydown':
- case 'keyup':
- case 'keypress':
- if (hook.value?.$expression) {
- event_handlers.push({
- type : name,
- expression: hook.value?.$expression,
- });
- }
- break;
+ if (domain == 'on') {
+
+ switch (name) {
+ case 'click':
+ case 'focus':
+ case 'hover':
+ case 'blur':
+ case 'change':
+ case 'input':
+ case 'keydown':
+ case 'keyup':
+ case 'keypress':
+ if (hook.value?.$expression) {
+ event_handlers.push({
+ type : name,
+ expression: hook.value?.$expression,
+ });
+ }
+ break;
+ }
}
}
diff --git a/lib/parser/builder.js b/lib/parser/builder.js
index 13f2400..6bdf6ec 100644
--- a/lib/parser/builder.js
+++ b/lib/parser/builder.js
@@ -1081,6 +1081,10 @@ Builder.setMethod(function _compileDirectiveValues(values, unwrap_optionals = tr
value : this._compileAttributeValue(value.value, unwrap_optionals),
};
+ if (value.domain) {
+ entry.domain = value.domain;
+ }
+
result.push(entry);
}
diff --git a/lib/parser/directives_parser.js b/lib/parser/directives_parser.js
index c246281..b7170f8 100644
--- a/lib/parser/directives_parser.js
+++ b/lib/parser/directives_parser.js
@@ -382,7 +382,8 @@ Dparser.setMethod(function parseCurrent() {
*/
Dparser.setMethod(function parseAttributes(result) {
- var next = this.next(),
+ let next = this.next(),
+ domain,
entry,
temp,
char,
@@ -434,11 +435,39 @@ Dparser.setMethod(function parseAttributes(result) {
continue;
}
+ domain = null;
char = next.value[0];
name = next.value;
- if (char === '!' || char === '#' || char === '+' || char === ':') {
+ if (char === '!' || char === '#' || char === '+' || char === ':' || char === '@') {
name = next.value.slice(1);
+
+ switch (char) {
+ case '!':
+ domain = 'directive';
+ break;
+
+ case '#':
+ domain = 'prop';
+ break;
+
+ case '+':
+ domain = 'var';
+ break;
+
+ case ':':
+ domain = 'hook';
+ break;
+
+ case '@':
+ domain = 'on';
+ break;
+ }
+ } else if (name.includes(':')) {
+ let parts = Bound.String.splitOnce(name, ':');
+
+ domain = parts[0];
+ name = parts[1];
}
entry = {
@@ -460,7 +489,7 @@ Dparser.setMethod(function parseAttributes(result) {
this.index--;
}
- if (char === '!') {
+ if (domain == 'directive') {
if (!result.directives) {
result.directives = [];
}
@@ -476,25 +505,27 @@ Dparser.setMethod(function parseAttributes(result) {
}
result.directives.push(entry);
- } else if (char === '#') {
+ } else if (domain == 'prop') {
if (!result.properties) {
result.properties = [];
}
result.properties.push(entry);
- } else if (char === '+') {
+ } else if (domain == 'var') {
if (!result.variables) {
result.variables = [];
}
result.variables.push(entry);
- } else if (char === ':') {
+ } else if (domain && domain != 'attr') {
if (!result.hooks) {
result.hooks = [];
}
+ entry.domain = domain;
+
result.hooks.push(entry);
} else {
result.attributes[entry.name] = entry;
diff --git a/test/50-directives.js b/test/50-directives.js
index 8ccba8b..9255bcd 100644
--- a/test/50-directives.js
+++ b/test/50-directives.js
@@ -205,6 +205,21 @@ describe('Directives', function() {
createTests(tests);
});
+ describe('Set properties using the `prop` domain', function() {
+ let tests = [
+ [
+ `<%= $0.testing %>`,
+ `ok`
+ ],
+ [
+ ``,
+ ``
+ ]
+ ];
+
+ createTests(tests);
+ });
+
describe('Apply directives using the ! syntax', function() {
var tests = [
@@ -236,6 +251,11 @@ describe('Directives', function() {
`