C# 双重编码和淘汰赛
我将其视为TypeScript的替代方案,因为它使用C,这意味着我的开发人员可以将他们已有的知识用于C,但我们也可以在客户端和服务器上重用验证逻辑 目前还没有敲除绑定,所以我创建了自己的,非常简单C# 双重编码和淘汰赛,c#,knockout.js,duocode,C#,Knockout.js,Duocode,我将其视为TypeScript的替代方案,因为它使用C,这意味着我的开发人员可以将他们已有的知识用于C,但我们也可以在客户端和服务器上重用验证逻辑 目前还没有敲除绑定,所以我创建了自己的,非常简单 namespace Knockout { [Js(Name = "ko", Extern = true)] public static class Global { [Js(Name = "observable", OmitGenericArgs = true)
namespace Knockout
{
[Js(Name = "ko", Extern = true)]
public static class Global
{
[Js(Name = "observable", OmitGenericArgs = true)]
public static extern Observable<T> Observable<T>();
[Js(Name = "observable", OmitGenericArgs = true)]
public static extern Observable<T> Observable<T>(T value);
[Js(Name = "computed", OmitGenericArgs = true)]
public static extern Observable<T> Computed<T>(Func<T> computed);
[Js(Name = "applyBindings")]
public static extern void ApplyBindings(object viewModel);
[Js(Name = "unwrap", OmitGenericArgs = true)]
public static extern T Unwrap<T>(Observable<T> observable);
}
[Js(Name = "ko.observable", Extern = true)]
public class Observable<T>
{
//TODO: Add more methods like subscribe, extend etc
}
}
其中有许多缺点是公认的解决方案
有什么想法吗
edit:Extension方法使它变得更好一些,但缺点是您现在需要包含使用Knockout绑定类库编译的javascript
public static class ObservableExtensions
{
public static void SetValue<T>(this Observable<T> observable, T value)
{
Js.referenceAs<Action<T>>("observable")(value);
}
}
而不仅仅是
this.get_Bar()("New value");
我还有一个问题,我也在研究击倒可观测阵列,我有这个
public static class ObservableExtensions
{
public static void Set<T>(this Observable<T> observable, T value)
{
observable.As<Action<T>>()(value);
}
public static T Get<T>(this Observable<T> observable)
{
return observable.As<Func<T>>()();
}
}
[Js(Name = "ko.observableArray", Extern = true)]
public class ObservableArray<T> : Observable<JsArray<T>>
{
[Js(Name = "push", OmitGenericArgs = true)]
public extern void Push(T value);
}
这将失败,因为敲除可观察数组需要一个正常的Javascript数组。我建议如下:
Bar.As()(“新值”)代码>
Bar.invoke(“新值”)代码>
public static void Set<T>(this Observable<T> o, T value)
{
o.As<Action<T>>()(value);
}
[Js(Name="")]
public void SetValue(T value)
[Js(Name = "observableArray", OmitGenericArgs = true)]
public static extern ObservableArray<T> ObservableArray<T>(object[] values);
关于您的第二个问题:查看mscorlib.js中的代码,$d.array
创建普通数组(只是为运行时类型信息添加了一些额外的属性)。这里的问题是,它为Int32之类的类型创建类型化数组。所以我想你可以创建一个对象数组而不是T,它应该可以工作,如下所示:
public static void Set<T>(this Observable<T> o, T value)
{
o.As<Action<T>>()(value);
}
[Js(Name="")]
public void SetValue(T value)
[Js(Name = "observableArray", OmitGenericArgs = true)]
public static extern ObservableArray<T> ObservableArray<T>(object[] values);
[Js(Name=“observearray”,省略genericargs=true)]
公共静态外部ObserverRay ObserverRay(对象[]值);
你对数组的内容没有任何意见?我想这应该会有帮助,请告诉我是否有,我回家后会试试,但是哎哟,删除类型安全性感觉像是一个很大的损失:/我同意,这不是最佳的。我开了一张罚单,谢谢你的帮助
[Js(Name="")]
public void SetValue(T value)
[Js(Name = "observableArray", OmitGenericArgs = true)]
public static extern ObservableArray<T> ObservableArray<T>(object[] values);