DotVVM:包装第三方JavaScript控件的步骤,这些控件具有用于KnockoutJS的内置自定义绑定处理程序

时间:2017-05-12 22:15:25

标签: dotvvm

我想使用一些JavaScript控件,它们已经实现了KnockoutJS绑定处理程序。在查看DotVVM教程之后,例如"仅代码控制"以及来自DotVVM源代码的控件,我很困惑通过DotVVM"渲染管道,#34;渲染管道需要渲染的控件的方面和程度。如果他们确实需要。

此外,如果控件已经实现了KnockoutJS绑定处理程序,那么包装它们的过程是否与已经实现的KnockoutJS绑定处理程序的控件相同?

1 个答案:

答案 0 :(得分:4)

如果您已经拥有Knockout绑定处理程序,则只需编写一个控件来呈现相应的HTML。

这里唯一的困难是控件属性的值可能在标记中被硬编码,或者它可以是数据绑定。有些属性只允许这些方法中的一种,有些只允许这两种方式。

基本上,您需要创建一个继承自HtmlGenericControl的类,并在基础构造函数中告诉它应该呈现哪个HTML元素。例如:public MyControl() : base("div")

然后您需要声明控件属性。使用dotprop代码段生成属性正文,使用MarkupOptions属性可以禁用硬编码值或数据绑定(如果没有意义。)

最后,您需要呈现HTML。如果您只需要呈现data-bind属性,则只需覆盖AddAttributesToRender

您可以致电writer.AddKnockoutDataBind("myBindingHandler", this, MyProperty, () => { /* handle the hard-coded value */ } )。 如果属性包含数据绑定,则会自动转换。如果它包含硬编码值,则将调用最后一个参数(lambda)。

如果控件更复杂并使用模板或调用回发,则需要在控件内部构建子控件,正确设置其绑定,在这种情况下不需要手动渲染它们。

DotVVM使用如此复杂的渲染管道有几个原因:

  • 由于属性可以包含数据绑定和硬编码值,因此您将以许多if语句结束。有时,绑定在服务器上进行评估,有时会被转换为JS。此外,一些控件非常复杂,需要构建一些子控件。
  • Knockout需要data-bind属性中声明的所有属性。它们用逗号分隔,因此API处理串联和转换为正确的JavaScript表达式。
  • 将控件呈现拆分为AddAttributesToRenderRenderBeginTagRenderContentsRenderEndTag方法允许使用继承扩展控件。我们已经从ASP.NET Web Forms复制了它,因为它运行得很好。

如果你能提供一个你想要渲染的例子,我可以给出更具体的答案。