SystemJs 异步加载 ES6 模块时如何处理 Kendo MVC 事件绑定
How to deal with Kendo MVC event binding when ES6 Modules loaded asyncronous by SystemJs
由于 SystemJs 异步加载模块,因此您无法将事件直接绑定到 html 文件中。即使在 System.import 之后声明控件,此时所有函数都未定义。
例如,以下内容不起作用:
<script type="text/javascript">
System.import('myModule'); //myModule contains a function called onClick.
</script>
@(Html.Kendo().Button()
.Name("RazorButton")
.Content("RazorButton")
.HtmlAttributes(new { type = "button" })
.Events(ev => ev.Click("onClick")))
<button id="html5Button">Html5 Button</button>
<script type="text/javascript">
$("#html5Button").kendoButton({
click: onClick
});
</script>
在此示例中,onClick 始终未定义。
这对于 html5 方法来说并不是真正的问题,因为我可以将按钮初始化到模块中。然而,使用 MVC 包装器,这是在这里初始化按钮的常用方法。
有没有一种方法可以将 Kendo MVC 包装器与 SystemJs 模块结合起来使用而没有缺点?
我没有真正找到绝对没有缺点的解决方案。
但是,这个解决方案对我有用:
在您的模块中创建方法 bindEvents。
myModule.ts
export class MyModule {
bindEvents = () => {
$("#RazorButton").data("kendoButton").bind("click", this.buttonClick);
}
buttonClick = (e) => {
//do something...
}
}
为您的模块创建工厂。
myModuleFactory.ts:
import { MyModule} from "./myModule";
export function Create(): MyModule{
return new MyModule();
}
将工厂导入视图。从工厂调用 Create 方法并获取 MyModule 作为 Return 值。然后从 MyModule 调用 bindEvents。
view.cshtml:
<script type="text/javascript">
System.import('myModuleFactory').then(function (e) {
var vm = e.Create();
vm.bindEvents();
}).catch(console.error.bind(console));
</script>
此处的缺点是,您需要知道 kendo 事件的名称。
由于 SystemJs 异步加载模块,因此您无法将事件直接绑定到 html 文件中。即使在 System.import 之后声明控件,此时所有函数都未定义。
例如,以下内容不起作用:
<script type="text/javascript">
System.import('myModule'); //myModule contains a function called onClick.
</script>
@(Html.Kendo().Button()
.Name("RazorButton")
.Content("RazorButton")
.HtmlAttributes(new { type = "button" })
.Events(ev => ev.Click("onClick")))
<button id="html5Button">Html5 Button</button>
<script type="text/javascript">
$("#html5Button").kendoButton({
click: onClick
});
</script>
在此示例中,onClick 始终未定义。
这对于 html5 方法来说并不是真正的问题,因为我可以将按钮初始化到模块中。然而,使用 MVC 包装器,这是在这里初始化按钮的常用方法。
有没有一种方法可以将 Kendo MVC 包装器与 SystemJs 模块结合起来使用而没有缺点?
我没有真正找到绝对没有缺点的解决方案。
但是,这个解决方案对我有用:
在您的模块中创建方法 bindEvents。
myModule.ts
export class MyModule {
bindEvents = () => {
$("#RazorButton").data("kendoButton").bind("click", this.buttonClick);
}
buttonClick = (e) => {
//do something...
}
}
为您的模块创建工厂。
myModuleFactory.ts:
import { MyModule} from "./myModule";
export function Create(): MyModule{
return new MyModule();
}
将工厂导入视图。从工厂调用 Create 方法并获取 MyModule 作为 Return 值。然后从 MyModule 调用 bindEvents。
view.cshtml:
<script type="text/javascript">
System.import('myModuleFactory').then(function (e) {
var vm = e.Create();
vm.bindEvents();
}).catch(console.error.bind(console));
</script>
此处的缺点是,您需要知道 kendo 事件的名称。