我想使用一些 JavaScript 控件,它们已经实现了 KnockoutJS 绑定处理程序。在查看 DotVVM 教程(例如“仅代码控件”以及 DotVVM 源代码中的控件)之后,我对需要通过 DotVVM“渲染管道”渲染控件的哪些方面和程度感到困惑,如果他们确实需要。
此外,如果控件已经实现了 KnockoutJS 绑定处理程序,那么包装它们的过程是否与尚未实现 KnockoutJS 绑定处理程序的控件相同?
我想使用一些 JavaScript 控件,它们已经实现了 KnockoutJS 绑定处理程序。在查看 DotVVM 教程(例如“仅代码控件”以及 DotVVM 源代码中的控件)之后,我对需要通过 DotVVM“渲染管道”渲染控件的哪些方面和程度感到困惑,如果他们确实需要。
此外,如果控件已经实现了 KnockoutJS 绑定处理程序,那么包装它们的过程是否与尚未实现 KnockoutJS 绑定处理程序的控件相同?
如果您已经有 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 窗体中复制了它,因为它运行良好。如果您可以提供一个示例来说明您要渲染什么,我可以给出更具体的答案。