编辑
2024-04-28
我当开发
00

目录

1. 引出问题🤔
2. 另一种思路💡
3. 思考💭

我的画板 by fabritor.png

1. 引出问题🤔

在写一个父子页面交互的事件时遇到了一个问题,环境是FineUICore,子页面用windowIFrame,在window执行保存后,需要执行父页面的赋值方法;

比如 F.ui.tbxProvince.setValue('结果');,这里直接写的js,其实在后台是 UIHelper.TextBox("tbxProvince").Text(province); 这两个效果是一样的

但是在子页面直接执行 F.ui.tbxProvince 是找不到😕的,子页面没这个控件,所以要在父页面调用,可以这样写

javascript
F.getActiveWindow().window.F.ui.tbxProvince.setValue('结果');

F.getActiveWindow().window就是激活这个窗口的window对象,

在后台我将 F.ui.tbxProvince.setValue('结果'); 封装为一个方法,比如 SetText

c#
public async Task SetText(string value) { var script = $"F.ui['tbxProvince'].setText('{value}');"; PageContext.RegisterStartupScript(script); }

如果加上 F.getActiveWindow().window 就要重写📝 ,或给 SetText增加参数,比如👇

c#
public async Task WindowSetText(string value) { var script = $"F.getActiveWindow().window.F.ui['tbxProvince'].setText('{value}');"; PageContext.RegisterStartupScript(script); }

在调用时,

c#
[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Window1_Close() { await WindowSetText('结果'); return UIHelper.Result(); }

这里我认为 SetTextWindowSetText 是干的一件事:setText,只不过作用域(作用域这个词可能不准确)不一样,同一件事写两个地方,维护是不方便的;同样如果给 SetText增加一个参数来定义作用域也不好,这个样SetText对外也是破坏性的

2. 另一种思路💡

既然作用域不一样,那我就声明一个作用域,让SetText判断当前在哪个作用域下,从而执行不一样的行为;

比如我想写成这样👇

c#
[HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Window1_Close() { //告诉内部的代码生成js时应该加上 F.getActiveWindow().window. await ActiveWindow(async () => { SetText(province); }); return UIHelper.Result(); }

SetText 中如何得到 ActiveWindow 从而判断呢,这个我倒是经常用✅ 直接让GPT优化了下

c#
public bool IsMethodActiveWindowCalledInCallStack() { StackTrace stackTrace = new StackTrace(); StackFrame[] stackFrames = stackTrace.GetFrames(); //这里要遍历向上找,因为异步 return stackFrames?.Any(frame => frame.GetMethod()?.Name.Contains("ActiveWindow") ?? false) ?? false; }

SetText写成这样

c#
public async Task SetText(string value) { var top = IsMethodActiveWindowCalledInCallStack() ? "F.getActiveWindow().window." : ""; var script = $"{top}F.ui['tbxProvince'].setText('{value}');"; PageContext.RegisterStartupScript(script); }

3. 思考💭

这里是一个例子,实际上不是为了写个简单的✨SetText,而是为了写方法提供的一个思路🧠,

简单的GetFrames也会消耗性能,在FineUI中父子页面交互 通过 ActiveWindow.GetWriteBackValueReferencePageContext.RegisterStartupScript 配合使用,

像输出的js增加一个头 F.getActiveWindow().window. 的这种例子 应该写到 PageContext.RegisterStartupScript中 或更底层🔨,

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:没想好

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!