AngularJS:如何从工厂返回可重用对象?

时间:2014-03-12 16:05:00

标签: javascript angularjs angularjs-factory

在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。我并不完全清楚或者实施这一目标的最佳策略是什么。

我原以为我想向上dataSourceFactory与我从控制器执行abstractDataFactory的方式相同,并且这些参数传递给{{ 1}}来自abstractDataFactory

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

dataSourceFactory

根据我的理解,Angular工厂返回功能,所以我认为这不是我正在寻找的。

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

控制器:

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

DataSourceFactory:

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;

});

1)数据源必须是新var dataSource = dataSourceFactory.contentTypes(); // returns a function, rather than kendo.data.DataSource object 对象的值,而不是函数。由于工厂返回功能,如何在我的控制器中使用它,这是正确的方法,如果没有建议?

2)我将在kendo.data.DataSource中定义各种数据源,并按上述方式使用。这是推荐的(我要使用代码重用,而不是每个数据源都有一堆独立的工厂),如果没有,建议?

1 个答案:

答案 0 :(得分:0)

感谢评论中的微妙推动,我能够解决这个问题。

第一个问题是我实际上没有从函数调用中返回任何内容(缺少来自return的{​​{1}}语句)。

其次,我必须在代表contentTypes:的{​​{1}}内定义dataFactory

dataSourceFactory

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