挖空.js当视图模型的属性重命名时,绑定会断开



这是我第一次在这里提问,所以请宽容:)

在由 knockout.js 提供支持的 MVC Web 应用程序中,我有,作为明确的例子:

  1. C# 中的简单视图模型类:

    public class RetailCustomer
    {
        public DateTime BirthDate { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
  2. 在 MVC 视图上挖空.js的简单绑定:

    function CustomerCtxViewModel() {
        var self = this;
        self.FirstName = ko.observable('');
        self.LastName = ko.observable('');
        self.BirthDate = ko.observable('');
        $.getJSON("/api/RetailContext", function (data) {
            self.FirstName(data.FirstName);
            self.LastName(data.LastName);
            self.BirthDate(data.BirthDate);
        }
    }
    

然后我将类中的属性BirthDate重命名为RetailCustomer Birthdate,因为代码分析告诉我......当然,绑定不再起作用,最糟糕的是我只在运行时发现它。

:是否有任何工具、技术可以在编译时或自动化构建期间及早警告我,以便我可以在应用程序运行之前看到我的错误?

super cool 是正确的:绑定发生在运行时,视图模型是一个动态对象,因此没有实用的方法可以确保视图模型和所需的绑定在编译/构建时匹配。

原则上,如果您使用的是 TypeScript,构建过程可以分析 HTML 并从中推断出一个接口,然后可以将其应用于您的视图模型,但即使这样也只是applyBindings适用于整个 HTML 文档的一般情况。 applyBindings可用于单个 HTML 元素。这将是一个非常复杂的系统,据我所知,从未尝试过。

对于这种情况,可以使用 @Html.NameFor 帮助程序,以防数据对象(JSON)与 .cshtml 文件上的模型类型相同。如果要在编译时验证语法,可以编辑 csproj 并将 MvcBuildViews 定义为 true。这样,您将在编译时知道 Razor 何时会失败。如果您在编译时遇到问题,请检查此问题。

我没有用过它,但是T4TS可以从C#类生成TypeScript接口定义。

C#:

[TypeScriptInterface]
public class RetailCustomer
{
    public DateTime BirthDate { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

JavaScript:

$.getJSON("/api/RetailContext", function (data: T4TS.RetailCustomer) {
    self.FirstName(data.FirstName);
    self.LastName(data.LastName);
    self.BirthDate(data.BirthDate);
}

我还发现了TypeLITE,它的作用大致相同。

相关内容

  • 没有找到相关文章

最新更新