使用自己的构造函数的 AMD 实例模块 - Durandal

AMD instance module that uses its own constructor - Durandal

在带有 MVC + Web API 后端的 Durandal 应用程序中,我有以下 C# class:

public class ProductFilter
{
    public string Name { get; set; }
    public List<ProductFilter> DependentFilters { get; set; }
}

我有一个前端实例模型 filter.js,我想映射到这个 class。目前看起来像这样:

define(["models/filter"], function (filter) {
    return function (data) {
        var self = this;
        data = data || {};

        self.name = ko.observable(ko.unwrap(data.name || ""));

        self.dependentFilters = ko.observableArray();

        $.each(ko.unwrap(data.dependentFilters || []), function () {

            // ---> 'filter' is undefined, so I cannot call new filter(..)
            self.dependentFilters.push(new filter(this));
        }); 
    };
});

如您所见,C# class 有一个自己类型的集合,我需要在 Durandal 模型上复制该结构。在上面的示例中,我尝试将 filter.js 模块注入自身,但 RequireJs 似乎不喜欢这样,因为 filter 变量始终是 undefined.

我的问题可能源于缺乏 RequireJsAMD 模块知识,但我如何真正调用当前模块本身的构造函数?

定义函数,让它有一个名字,然后从它自己调用它。然后,您可以 return 通过按名称引用该函数:

define(function () {
    function filter (data) {
        // ... same as in your question ...
        $.each(ko.unwrap(data.dependentFilters || []), function () {
            self.dependentFilters.push(new filter(this));
        }); 
    };

    return filter;
});