From 98f43889c427cda5668ab2ca7d61df16914c77b8 Mon Sep 17 00:00:00 2001 From: David Greenspan Date: Thu, 25 Jul 2013 07:57:26 -0700 Subject: [PATCH] basic fields, `set`, event.component --- packages/ui/fields.js | 8 ++++++++ packages/ui/template.js | 24 +++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/ui/fields.js b/packages/ui/fields.js index 9a6a2606e1..5271133463 100644 --- a/packages/ui/fields.js +++ b/packages/ui/fields.js @@ -72,6 +72,14 @@ _extend(UI.Component, { lookup: function (id) { return this.get(id, true); }, + set: function (id, value) { + var comp = findComponentWithProp(id, this); + if (! comp || ! comp[id]) + throw new Error("Can't find field: " + id); + if (! comp[id].$set) + throw new Error("Not a settable field: " + id); + comp[id].$set(value); + }, // convenient syntax withData: function (data) { return this.extend({data: data}); diff --git a/packages/ui/template.js b/packages/ui/template.js index a58d7bbe43..61436e45b0 100644 --- a/packages/ui/template.js +++ b/packages/ui/template.js @@ -27,7 +27,24 @@ UI.makeTemplate = function (underlying) { var oldProp = underlying[k]; var givenProp = options[k]; - if (k.indexOf(' ') >= 0) { + if (k === 'fields') { + // XXX basic fields impl + // XXX could support functions as initial field values + _.each(givenProp, function (fieldValue, fieldName) { + var getter = function () { + getter.$dep.depend(); + return getter.$value; + }; + getter.$value = fieldValue; // initial value + getter.$dep = new Deps.Dependency; + getter.$set = function (v) { + getter.$value = v; + getter.$dep.changed(); + }; + underlying[fieldName] = getter; + }); + + } else if (k.indexOf(' ') >= 0) { // event handler // XXX clean up var eventType = k.slice(0, k.indexOf(' ')); @@ -40,8 +57,9 @@ UI.makeTemplate = function (underlying) { handler: (function (handler) { return function (evt) { // XXX - var data = UI.body.findByElement( - evt.currentTarget).get(); + var comp = UI.body.findByElement(evt.target); + evt.component = comp; + var data = comp.get(); handler.call(data, evt); }; })(givenProp)