我想使用一些JavaScript控件,它们已经实现了KnockoutJS绑定处理程序。在查看DotVVM教程之后,例如"仅代码控制"以及来自DotVVM源代码的控件,我很困惑通过DotVVM"渲染管道,#34;渲染管道需要渲染的控件的方面和程度。如果他们确实需要。
此外,如果控件已经实现了KnockoutJS绑定处理程序,那么包装它们的过程是否与已经实现的KnockoutJS绑定处理程序的控件相同?
答案 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。此外,一些控件非常复杂,需要构建一些子控件。data-bind
属性中声明的所有属性。它们用逗号分隔,因此API处理串联和转换为正确的JavaScript表达式。AddAttributesToRender
,RenderBeginTag
,RenderContents
和RenderEndTag
方法允许使用继承扩展控件。我们已经从ASP.NET Web Forms复制了它,因为它运行得很好。 如果你能提供一个你想要渲染的例子,我可以给出更具体的答案。