在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工厂返回功能,所以我认为这不是我正在寻找的。 p>
到目前为止,这是我的非工作实现:
控制器:
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
中定义各种数据源,并按上述方式使用。这是推荐的(我要使用代码重用,而不是每个数据源都有一堆独立的工厂),如果没有,建议?
答案 0 :(得分:0)
感谢评论中的微妙推动,我能够解决这个问题。
第一个问题是我实际上没有从函数调用中返回任何内容(缺少来自return
的{{1}}语句)。
其次,我必须在代表contentTypes:
的{{1}}内定义dataFactory
:
dataSourceFactory
我还不清楚,这是否是一个好方法 - 让一个工厂返回我的所有数据源对象。