From 660508d2ee90769e717f1505f2005d2a9ae5bcb2 Mon Sep 17 00:00:00 2001 From: Derick Bailey Date: Sun, 23 Sep 2012 17:54:02 -0700 Subject: [PATCH] alternate syntax for computed field definition using object literal --- readme.md | 21 ++++++----- spec/javascripts/computedField.spec.js | 49 +++++++++++++++++--------- src/backbone.compute.js | 16 +++++---- 3 files changed, 53 insertions(+), 33 deletions(-) diff --git a/readme.md b/readme.md index 3c7ddbc..4c2b91f 100644 --- a/readme.md +++ b/readme.md @@ -33,10 +33,13 @@ var Model = Backbone.Model.extend({ // tell it what field to `set` on the model // tell it what fields this one depends on // give it a callback function to compute the value when any dependent field changes - computedField: Backbone.Compute("computedField", ["f1", "f2"], function(fields){ - fieldList = fields; - return fields.f1 + "-" + fields.f2 - }) + someField: { + fields: ["f1", "f2"], + compute: function(fields){ + fieldList = fields; + return fields.f1 + "-" + fields.f2 + } + } }); @@ -46,14 +49,14 @@ var model = new Model({ }); // get the current value -model.get("computedField"); // => "foo-bar" +model.get("someField"); // => "foo-bar" // re-run the computation, `set` the current value and return it -model.computedField(); // => "foo-bar" +model.someField(); // => "foo-bar" // Handle "change" events for the computed field -model.on("change:computedField", function(){ +model.on("change:someField", function(){ // do stuff when the computed field changes }); @@ -64,8 +67,8 @@ model.set({ }); // get the updated value -model.get("computedField"); // => "boo-far" -model.computedField(); // => "boo-far" +model.get("someField"); // => "boo-far" +model.someField(); // => "boo-far" ``` ## License diff --git a/spec/javascripts/computedField.spec.js b/spec/javascripts/computedField.spec.js index 4ff3195..a2180cc 100644 --- a/spec/javascripts/computedField.spec.js +++ b/spec/javascripts/computedField.spec.js @@ -8,10 +8,13 @@ describe("computed fields", function(){ Backbone.Compute(this); }, - computedField: Backbone.Compute("computedField", "anotherField", function(fields){ - fieldList = fields; - return fields.anotherField + "-bar" - }) + computedField: { + fields: "anotherField", + compute: function(fields){ + fieldList = fields; + return fields.anotherField + "-bar" + } + } }); beforeEach(function(){ @@ -37,10 +40,13 @@ describe("computed fields", function(){ Backbone.Compute(this); }, - computedField: Backbone.Compute("computedField", ["f1", "f2"], function(fields){ - fieldList = fields; - return fields.f1 + "-" + fields.f2 - }) + computedField: { + fields: ["f1", "f2"], + compute: function(fields){ + fieldList = fields; + return fields.f1 + "-" + fields.f2 + } + } }); beforeEach(function(){ @@ -68,10 +74,13 @@ describe("computed fields", function(){ Backbone.Compute(this); }, - computedField: Backbone.Compute("computedField", ["f1", "f2"], function(fields){ - fieldList = fields; - return fields.f1 + "-" + fields.f2 - }) + computedField: { + fields: ["f1", "f2"], + compute: function(fields){ + fieldList = fields; + return fields.f1 + "-" + fields.f2 + } + } }); beforeEach(function(){ @@ -96,10 +105,13 @@ describe("computed fields", function(){ Backbone.Compute(this); }, - computedField: Backbone.Compute("computedField", ["f1", "f2"], function(fields){ - fieldList = fields; - return fields.f1 + "-" + fields.f2 - }) + computedField: { + fields: ["f1", "f2"], + compute: function(fields){ + fieldList = fields; + return fields.f1 + "-" + fields.f2 + } + } }); beforeEach(function(){ @@ -137,7 +149,10 @@ describe("computed fields", function(){ Backbone.Compute(this); }, - computedField: Backbone.Compute("computedField", ["f1", "f2"], handler) + computedField: { + fields: ["f1", "f2"], + compute: handler + } }); model = new Model({ diff --git a/src/backbone.compute.js b/src/backbone.compute.js index dafb775..676af93 100644 --- a/src/backbone.compute.js +++ b/src/backbone.compute.js @@ -8,7 +8,13 @@ Backbone.Compute = (function(Backbone, _){ // model's `initialize` function. function initializeModel(obj){ for(var field in obj){ - if (obj[field] && obj[field].computedField){ + var computeAttr = obj[field]; + if (computeAttr + && computeAttr.fields + && computeAttr.compute + ){ + + obj[field] = computeField(field, computeAttr.fields, computeAttr.compute); obj[field].call(obj); } } @@ -70,12 +76,8 @@ Backbone.Compute = (function(Backbone, _){ // The raw API for computed fields. Determines whether // you are attempting to initialize the model or define // a computed field, and call the correct behavior. - var Compute = function(){ - if (arguments.length === 1){ - return initializeModel(arguments[0]); - } else { - return computeField.apply(null, arguments); - } + var Compute = function(model){ + return initializeModel(model); }; return Compute;