2

我想使用一些 JavaScript 控件,它们已经实现了 KnockoutJS 绑定处理程序。在查看 DotVVM 教程(例如“仅代码控件”以及 DotVVM 源代码中的控件)之后,我对需要通过 DotVVM“渲染管道”渲染控件的哪些方面和程度感到困惑,如果他们确实需要。

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

4

1 回答 1

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 表达式。
  • 将控件呈现拆分为AddAttributesToRenderRenderBeginTag和方法允许使用继承来扩展控件RenderContentsRenderEndTag我们从 ASP.NET Web 窗体中复制了它,因为它运行良好。

如果您可以提供一个示例来说明您要渲染什么,我可以给出更具体的答案。

于 2017-05-14T06:38:50.670 回答