internal static void SendMauVariable(MauComponent holder, string mauVarName) { PropertyInfo pInfo = holder.GetType().GetProperty(mauVarName); if (pInfo == null) { throw new ArgumentException("Variable not found", nameof(mauVarName)); } if (!HasAttribute(pInfo)) { throw new ArgumentException("Variable not 'MauVariable'", nameof(mauVarName)); } // Ui not register yet (RegisterComponent function not called) if (string.IsNullOrWhiteSpace(holder.MauId)) { return; } // Get Data var data = new JObject { { "varName", mauVarName }, { "varValue", MyAngularUi.ParseMauDataToFrontEnd(pInfo.PropertyType, pInfo.GetValue(holder)) } }; MyAngularUi.SendRequestAsync(holder.MauId, MyAngularUi.RequestType.SetVarValue, data); }
internal static void SendMauProp(MauComponent holder, string mauPropName) { MauPropertyHolder mauPropHolder = holder.GetMauPropHolder(mauPropName); Type propType = holder.HandledProps[mauPropName].Holder.PropertyType; object propValue = holder.HandledProps[mauPropName].Holder.GetValue(holder); // bypass is for props not yet changed from .Net side // so it's just to not override angular prop value bool bypass = false; if (!mauPropHolder.Touched) { bypass = true; } else if (mauPropHolder.PropAttr.PropStatus == MauPropertyStatus.ReadOnly) { bypass = true; } else if (propType.IsEnum) { if (!MauEnumMemberAttribute.HasNotSetValue(propValue.GetType())) { throw new Exception($"NotSet must to be in any MauProperty value is 'Enum', {propValue.GetType().FullName}"); } if (MauEnumMemberAttribute.HasAttribute((Enum)propValue)) { propValue = MauEnumMemberAttribute.GetValue((Enum)propValue); } // If it's NotSet just ignore so the angular value will be set, // Angular value will be in .Net side, so the value will be correct here. // E.g: Color prop if it's NotSet in .Net then use and don't change // Angular value. switch (propValue) { case int: case long and 0: case string propValStr when string.IsNullOrWhiteSpace(propValStr): bypass = true; break; } } else if (propValue == null && propType == typeof(string)) { // null not same as empty string bypass = true; } // Don't send .Net value and ask angular for it's value if (bypass) { holder.RequestPropValue(mauPropName); return; } var data = new JObject { { "propType", (int)mauPropHolder.PropAttr.PropType }, { "propStatus", (int)mauPropHolder.PropAttr.PropStatus }, { "propForce", mauPropHolder.PropAttr.ForceSet }, { "propName", mauPropName }, { "propVal", MyAngularUi.ParseMauDataToFrontEnd(propType, propValue) } }; MyAngularUi.SendRequestAsync(holder.MauId, MyAngularUi.RequestType.SetPropValue, data); }