2

Is there a way I can instantiate a Javascript variable (using ClearScript.V8) and catch the updates in C# so I can update the value in database?

It works when I use an object, like this:

public class SmartBoolean : ISmartVariable
{
    private Boolean _simulation;
    private Guid UserId;
    private long userKeyId;
    private long variableKeyId;
    private string Name;
    private Boolean _value;
    public Boolean value
    {
        get {
            return _value;
        }

        set {
            _value = value;

            if (!_simulation)
            {
                if (value)
                    new SmartCommon().SetTrue(userKeyId, variableKeyId);
                else
                    new SmartCommon().SetFalse(userKeyId, variableKeyId);
            }
        }
    }

    public SmartBoolean(Guid UserId, long userKeyId, long variableKeyId, string Name, Boolean value, Boolean simulation)
    {
        this.Name = Name;
        this._value = value;
        this.UserId = UserId;
        this.userKeyId = userKeyId;
        this.variableKeyId = variableKeyId;
        this._simulation = simulation;
    }

    public Boolean toggle()
    {
        this.value = !this._value;

        return this._value;
    }
}

but then the Javascript code needs to use an object like

variable.value

instead of simply

variable

.

pdube
  • 593
  • 1
  • 11
  • 26

1 Answers1

3

You can define a JavaScript global property with accessors that call into your smart variable:

dynamic addSmartProperty = engine.Evaluate(@"
    (function (obj, name, smartVariable) {
        Object.defineProperty(obj, name, {
            enumerable: true,
            get: function () { return smartVariable.value; },
            set: function (value) { smartVariable.value = value; }
        });
    })
");

var smartVariable = new SmartBoolean(...);
addSmartProperty(engine.Script, "variable", smartVariable);

engine.Execute("variable = true");
BitCortex
  • 3,328
  • 1
  • 15
  • 19