我是角色的忠实粉丝,但它有一些棘手的概念,它们之间存在极其微妙的差异,这就是其中之一.
我只想创建一个类,我可以用它在我的Angular控制器和工厂中创建自定义对象.它肯定不应该那么难,但我无法弄清楚如何做到这一点.我想有一个自定义的ResultSet类,我可以实例化它来创建ResultSet的实例.然而,对于我的生活,我无法弄清楚工厂诉服务的正确语法.
这是所有我想要的:
ResultSet = function(dataSet){
this.filter = function(){
# filters and returns dataSet
# ...
}
}
Run Code Online (Sandbox Code Playgroud)
然后我希望能够在控制器内实例化ResultSet的实例等:
MyApp.controller('pageCtrl', ['ResultSet', (ResultSet) ->
# ...
rs = ResultSet.new(dataToFilter)
Run Code Online (Sandbox Code Playgroud)
使用Angular Service而不是Factory似乎更正确,因为服务返回一个对象的实例(这正是我想要的).但我无法弄清楚如何做到这一点......
我如何使用服务来声明我的自定义ResultSet类,然后如何从中实例化实例?
Amr*_*lon 13
也许你正在寻找这样的东西:
.factory('User', function (Organisation) {
/**
* Constructor, with class name
*/
function User(firstName, lastName, role, organisation) {
// Public properties, assigned to the instance ('this')
this.firstName = firstName;
this.lastName = lastName;
this.role = role;
this.organisation = organisation;
}
/**
* Public method, assigned to prototype
*/
User.prototype.getFullName = function () {
return this.firstName + ' ' + this.lastName;
};
/**
* Private property
*/
var possibleRoles = ['admin', 'editor', 'guest'];
/**
* Private function
*/
function checkRole(role) {
return possibleRoles.indexOf(role) !== -1;
}
/**
* Static property
* Using copy to prevent modifications to private property
*/
User.possibleRoles = angular.copy(possibleRoles);
/**
* Static method, assigned to class
* Instance ('this') is not available in static context
*/
User.build = function (data) {
if (!checkRole(data.role)) {
return;
}
return new User(
data.first_name,
data.last_name,
data.role,
Organisation.build(data.organisation) // another model
);
};
/**
* Return the constructor function
*/
return User;
})
Run Code Online (Sandbox Code Playgroud)
来自Gert Hengeveld的这篇文章.
JB *_*zet 10
myApp.factory('ResulSet', function() {
function ResultSetInstance(dataSet) {
this.filter = function(){
// ...
}
}
return {
createNew: function(dataSet) {
return new ResultSetInstance(dataSet);
}
};
});
Run Code Online (Sandbox Code Playgroud)
然后
myApp.controller('pageCtrl', function(ResultSet) {
var someData = ...;
var rs = ResultSet.createNew(someData);
}
Run Code Online (Sandbox Code Playgroud)
在进一步试验这一点后,我发现你甚至不需要这个createNew方法.
myApp.factory('ResultSetClass', function() {
ResultSetClass = function(dataSet) {
this.filter = function(){
// ...
}
}
return ResultSetClass
});
Run Code Online (Sandbox Code Playgroud)
工作得很好然后你可以打电话new ResultSetClass(args).
Coffeescript将返回类实例中的最后一个变量或方法,因此如果您使用coffeescript(作为一般规则),则必须this在类定义的末尾返回
myApp.factory 'ResultSetClass', () ->
ResultSetClass = (dataset) ->
this.filter = () ->
# do some stuff
return this
return ResultSetClass
Run Code Online (Sandbox Code Playgroud)
如果您没有this明确返回,那么当您打电话时,您会发现
myApp.factory 'ResultSetClass', () ->
ResultSetClass = (dataset) ->
this.filter = () ->
# do some stuff
Run Code Online (Sandbox Code Playgroud)
那么你只需留下coffeescript返回的最后一件事就是filter方法.
| 归档时间: |
|
| 查看次数: |
29931 次 |
| 最近记录: |