3

在 AngularJS 控制器中,我定义了以下内容:

app.controller('contentTypeController', ['$scope', '$log', 'abstractDataFactory', 'customFunctions',
    // the abstract data factory accepts controller type parameters for RESTful CRUD

    function ($scope, $log, abstractDataFactory, customFunctions) {

        var dataFactory = new abstractDataFactory("/odata/ContentType");

        var crudServiceBaseUrl = "/odata/ContentType";

        var dataSource = new kendo.data.DataSource({
            type: "odata",
            transport: {
                read:

                    function (options) {
                        var odataParams = kendo.data.transports["odata"].parameterMap(options.data, "read");

                        dataFactory.getList(odataParams)
                            .success(function (result) {
                                options.success(result);
                            })
                            .error (function (error) {
                                console.log("data error");
                            });
                  ...

这一切都很好。但是,我不想dataSource在另一个控制器中重新定义这个特定的数据集 - ContentType,并且想将其抽象出来。

结果,我创建了一个新的dataSourceFactory. 我并不完全清楚或实施此的最佳策略是什么。

我在想我想像我从控制器中一样的方式进行更新,并将这些参数传递给从.dataSourceFactoryabstractDataFactoryabstractDataFactorydataSourceFactory

将新的dataSourceFactory注入我的控制器后,它将返回各种数据源,具体取决于方法调用:

var dataSourceFactory = new dataSourceFactory("/odata/ContentType");
var dataSource = dataSourceFactory.contentType();  // .userDetails(), .someOtherData()...

据我了解,Angular 工厂返回函数,所以我不认为这正是我想要的。

到目前为止,这是我的非工作实现:

控制器:

app.controller('contentTypeController', ['$scope', '$log', 'dataSourceFactory', 'customFunctions',

    function ($scope, $log, dataSourceFactory, customFunctions) {

        var dataSourceFactory = new dataSourceFactory("/odata/ContentType");
        var dataSource = dataSourceFactory.contentTypes();  // returns a function, rather than kendo.data.DataSource object
        ...

数据源工厂:

// factory to return datasources
app.factory('dataSourceFactory', function (abstractDataFactory) {

    function dataSourceFactory(odataUrlBase) {
        this.dataFactory = new abstractDataFactory(odataUrlBase);
    }

    dataSourceFactory.prototype = {
        contentTypes: function () {
            new kendo.data.DataSource({
                type: "odata",
                transport: {
                    read:

                        function (options) {
                            var odataParams = kendo.data.transports["odata"].parameterMap(options.data, "read");

                            this.dataFactory.getList(odataParams)
                                .success(function (result) {
                                    options.success(result);
                                })
                                .error(function (error) {
                                    console.log("data error");
                                });

                        }
               },
                batch: false,
                pageSize: 10,
                serverPaging: true,
                change: function (e) {
                    console.log("change: " + e.action);
                    // do something with e
                },
                schema: {
                    data: function (data) {
                        //console.log(data)
                        return data.value;
                    },
                    total: function (data) {
                        console.log("count: " + data["odata.count"]);
                        return data["odata.count"];
                    },
                    model: {
                        id: "ContentTypeId",
                        fields: {
                            ContentTypeId: { editable: false, nullable: true },
                            //UserId: {editable: false, nullable: false },
                            Description: { type: "string", validation: { required: true } },
                            //msrepl_tran_version: { type: "string", validation: { required: true } }
                        }
                    }
                },
                error: function (e) {
                    //var response = JSON.parse(e.responseText);
                    var response = e.status;
                    console.log(response);
                }
            })  // dataSource
        }  // contentTypes
    };

    return dataSourceFactory;

});

总之,

var dataSource = dataSourceFactory.contentTypes();  // returns a function, rather than kendo.data.DataSource object     

1)数据源必须是新kendo.data.DataSource对象的值,而不是函数。由于工厂返回该功能,我如何在我的控制器中使用它,这是正确的方法吗?如果不是建议?

2)我将在dataSourceFactory上面定义和使用的各种数据源。是否建议这样做(我要重用代码,而不是为每个数据源创建一堆单独的工厂),如果不是,建议?

4

1 回答 1

0

感谢评论的微妙推动,我能够弄清楚这一点。

第一个问题是我实际上并没有从函数调用中返回任何内容(缺少returnfrom 的语句contentTypes:)。

其次,我必须在dataFactory里面定义一个dataSourceFactory代表abstractDataFactory

app.factory('dataSourceFactory', function (abstractDataFactory) {
    var dataFactory;

    function dataSourceFactory(odataUrlBase) {
        dataFactory = new abstractDataFactory(odataUrlBase);
    }

    dataSourceFactory.prototype = {
        contentTypes: function () {
            return new kendo.data.DataSource({ ... }...

我仍然不清楚的是,这是否是一种好方法 - 让我的所有数据源对象都由一个工厂返回。

于 2014-03-12T16:47:54.750 回答