1

我知道 Breeze 现在支持枚举类型,我可以毫无问题地在 html 中显示枚举类型。但是,我不知道如何在客户端编辑此字段。

例如:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public SexTypes SexType { get; set; }
}

public enum SexTypes
{
    Male, Female
}

我想使用选择标签来选择性别类型

<select ng-model="student.sexType" ng-options="g for g in sexTypes"></select>

当我查看元数据(通过 api/breeze/metadata)时,我确实看到我的枚举类型为

enumType: {
    name: "SexTypes",
    isFlags: "false",
    underlyingType: "Int32",
    member: [
        {
            name: "Male",
            value: "0"
        },
        {
            name: "Female",
            value: "1"
        }
    ]
},

现在,问题是如何$scope.sexTypes在我的控制器中填充?

4

4 回答 4

0

如果按照您解释的方式返回元数据,则选择的绑定将是

<select ng-model="student.sexType" ng-options="g.name for g.value in enumType.member"></select>
于 2013-11-09T17:30:24.033 回答
0

同时,作为一种解决方法,您可以从元数据中创建全局“枚举”,如下所示:

manager.fetchMetadata()
    .then(function (data) {

        // extract all enums als global objects
        ko.utils.arrayForEach(data.schema.enumType, function (c) {
            window[c.name] = {};
            ko.utils.arrayForEach(c.member, function (m) {
                window[c.name][m.name] = m.value;
            });
        });

});

因此,如果您有一个名为“SexType”的枚举,您现在将拥有一个可以调用的全局对象:

var gender = SexType.Female; //returns the value as defined in the server side enum
于 2014-01-23T17:34:06.820 回答
0

我就是这样做的。

步骤1

将我的服务器控制器配置为从~/api/breeze/enums?type={0} 之类的 url 返回枚举。

第2步

创建 dataContext 提供程序。

.provider("dataContext", [function () {
    var url = "/api/breeze";

    function context() {
        this.manager = new window.breeze.EntityManager(url);
    }

    context.prototype.query = function (entitySet) {
        return new window.breeze.EntityQuery(entitySet).using(this.manager);
    };

    context.prototype.saveChanges = function () {
        return this.manager.saveChanges();
    };

    this.$get = function () {
        return new context();
    };
}])

第 3 步

创建 myEntitySet 指令。

.directive("myEntitySet", ["dataContext", function (dataContext) {
    return {
        scope: true,
        restrict: "A",
        controller: ["$scope", function ($scope) {
            $scope.items = [];
        }],
        link: function ($scope, $element, $attrs) {
            dataContext.query($attrs.myEntitySet)
                .execute()
                .then(function (data) {
                    $scope.items = data.results;
                    $scope.$apply();
                });
        }
    };
}])

第4步

使用 myEntitySet 指令:

<select my-entity-set="Enums?type=ProductType"
    ng-model="item.Type"
    ng-options="c.Name as c.Name for c in items | orderBy:'Name':true">
</select>
于 2014-06-02T07:20:58.167 回答
0

我不相信 Breeze 以您期望的方式支持 Enum 类型。

当 Breeze 读取元数据时,它会看到这Student.sexType是一个枚举属性,并且枚举名称是SexType. 它在数据属性元数据中记录这两个事实。

var property = manager.metdataStore.getEntityType('Student').getDataProperty('sexType');
console.log(property.enumType); // "Edm.Self.Color"
console.log(property.dataType.name): // "String"

但这就是它“知道”的全部。Breeze 客户端MetadataStore忽略SexType来自服务器的元数据中的定义。它将属性的 设置DataTypeStudent.sexType“String”,因为它希望客户端使用枚举的字符串名称获取和设置属性。这就是它所做的一切

如果您想使用枚举值填充下拉列表,您必须自己制作一个列表并通过父 ViewModel(在 ng-speak 中也称为“控制器”)公开该列表。您可以对它们进行硬编码,也可以将它们从来自服务器的元数据流中提取出来。

Breeze 可以......也许应该......在MetadataStore. 我可以提供一个枚举验证器来检测您何时将属性设置为枚举选项之一。

不幸的是,据我所知,它目前没有做这些事情(v.1.4.5)。

我认为你有一个有价值的事业。我鼓励您在Breeze User Voice上表达您对这个主题的兴趣。

于 2013-11-11T03:06:38.203 回答