Skip to content

Commit 22dbcc5

Browse files
Updated to handle Pre-Rendering in preview3 - and removed the sample css and js from the library.
Bumped nuget package version to 0.1.0-beta-2
1 parent 3f97971 commit 22dbcc5

File tree

3 files changed

+79
-14
lines changed

3 files changed

+79
-14
lines changed

BlazorEmbedLibrary/EmbeddedContent.cs

Lines changed: 78 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,18 @@ public class EmbeddedContent : ComponentBase
1212
[Inject] IJSRuntime jSRuntime { get; set; }
1313
[Parameter] protected bool Debug { get; set; } = false;
1414
[Parameter] protected Type BaseType { get; set; }
15+
private bool PreRender { get; set; } = true;
1516

16-
protected override async Task OnInitAsync()
17+
protected override async Task OnAfterRenderAsync()
18+
{
19+
await base.OnAfterRenderAsync();
20+
if (!PreRender)
21+
{
22+
await LoadEmbeddedResources();
23+
}
24+
25+
}
26+
private async Task LoadEmbeddedResources()
1727
{
1828
foreach (var item in ListEmbeddedResources(BaseType))
1929
{
@@ -23,7 +33,7 @@ protected override async Task OnInitAsync()
2333
{
2434
case ".css":
2535
case ".js":
26-
if (!(await DoesLinkExist(BaseType,item)) && !(await DoesScriptExist(BaseType,item)))
36+
if (!(await DoesLinkExist(BaseType, item)) && !(await DoesScriptExist(BaseType, item)))
2737
{
2838
string content;
2939
using (var stream = GetContentStream(BaseType, item))
@@ -58,12 +68,9 @@ private void DebugLog(string message)
5868
if (Debug) Console.WriteLine(message);
5969
}
6070

61-
protected override bool ShouldRender()
62-
{
63-
return Debug;
64-
}
6571
protected override void BuildRenderTree(RenderTreeBuilder builder)
6672
{
73+
6774
base.BuildRenderTree(builder);
6875
if (Debug)
6976
{
@@ -83,6 +90,45 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
8390
builder.AddContent(1, "--- End Embedded Files ---");
8491
builder.CloseElement();
8592
}
93+
DetectRenderMode(builder);
94+
}
95+
96+
private void DetectRenderMode(RenderTreeBuilder builder)
97+
{
98+
try
99+
{
100+
var btype = builder.GetType();
101+
var rendererFI = btype.GetField("_renderer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
102+
if (rendererFI is null)
103+
{
104+
PreRender = false;
105+
return;
106+
}
107+
var renderer = rendererFI.GetValue(builder);
108+
if (renderer is null)
109+
{
110+
PreRender = false;
111+
return;
112+
}
113+
var rendererType = renderer.GetType();
114+
if (rendererType is null)
115+
{
116+
PreRender = false;
117+
return;
118+
}
119+
var renderModeFI = rendererType.GetField("_prerenderMode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
120+
if (renderModeFI is null)
121+
{
122+
PreRender = false;
123+
return;
124+
}
125+
126+
PreRender = (bool)renderModeFI.GetValue(renderer);
127+
}
128+
catch
129+
{
130+
// older previews didn't have pre-render
131+
}
86132
}
87133

88134
public async Task AttachStyleSheet(string name, string content)
@@ -123,7 +169,17 @@ public async Task<bool> DoesLinkExist(Type type, string name)
123169
}
124170
string script = $"document.head.querySelector(\"link[id='{SafeFileName(name)}'],link[href='{fileName}']\")";
125171
DebugLog($"DoesLinkExist {name}: {script}");
126-
var result = await jSRuntime.InvokeAsync<object>("eval", script);
172+
object result = null;
173+
try
174+
{
175+
result = await jSRuntime.InvokeAsync<object>("eval", script);
176+
}
177+
catch (Exception ex)
178+
{
179+
180+
Console.WriteLine(ex);
181+
182+
}
127183
bool found = !(result is null);
128184
DebugLog($"DoesLinkExist {name}: {found}");
129185
return found;
@@ -134,14 +190,24 @@ public async Task<bool> DoesScriptExist(Type type, string name)
134190
// name will be blazor:js:somthing.js or AssemblyNameSpace.somthing.js
135191
string[] parts = name.Split(':');
136192
string fileName = parts[parts.Length - 1];
137-
if (parts.Length==3)
193+
if (parts.Length == 3)
138194
{
139195
// the name is blazor:js:somthing.js
140196
fileName = $"_content/{type.Assembly.GetName().Name}/{fileName}";
141197
}
142198
string script = $"document.head.querySelector(\"script[id='{SafeFileName(name)}'],script[src='{fileName}']\")";
143199
DebugLog($"DoesScriptExist {name}: {script}");
144-
var result = await jSRuntime.InvokeAsync<object>("eval", script);
200+
object result = null;
201+
try
202+
{
203+
result = await jSRuntime.InvokeAsync<object>("eval", script);
204+
}
205+
catch (Exception ex)
206+
{
207+
208+
Console.WriteLine(ex);
209+
210+
}
145211
bool found = !(result is null);
146212
DebugLog($"DoesScriptExist {name}: {found}");
147213
return found;
@@ -150,7 +216,7 @@ public async Task<bool> DoesScriptExist(Type type, string name)
150216
public IEnumerable<string> ListEmbeddedResources(Type type)
151217
{
152218
var resources = type.Assembly.GetManifestResourceNames();
153-
Console.WriteLine($"Got resources: {string.Join(", ",resources)}");
219+
Console.WriteLine($"Got resources: {string.Join(", ", resources)}");
154220
DebugLog($"Using type: {type.Name} from {type.Assembly.GetName().Name}");
155221
foreach (var item in resources)
156222
{
@@ -165,7 +231,8 @@ public System.IO.Stream GetContentStream(Type type, string name)
165231
}
166232

167233
string SafeFileName(string name) => name.Replace(":", "_");
168-
234+
169235
string SafeJsString(string content) => content.Replace(@"\", @"\\").Replace("\r", @"\r").Replace("\n", @"\n").Replace("'", @"\'").Replace("\"", @"\""");
236+
170237
}
171238
}

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project>
22
<PropertyGroup>
33
<BlazorVersion>0.8.0-preview-19104-04</BlazorVersion>
4-
<ReleaseVersion>0.1.0-beta-1</ReleaseVersion>
4+
<ReleaseVersion>0.1.0-beta-2</ReleaseVersion>
55
</PropertyGroup>
66
</Project>

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ This is the component library that provides all the functionality.
1111

1212
It is a netstandard component library (i.e. a netstandard2.0 library) with one c# code file.
1313

14-
I have included two sample static files, one css that makes the body background cyan, and one JS file that you can test from the dev tools console `testjs.testfunc()` - shows an alert.
15-
1614
### BlazorComponentSample
1715

1816
An out-of-the-box sample Blazor component library with static files.

0 commit comments

Comments
 (0)