Как создать пользовательский класс объектов, доступный для моих методов в AngularJS
Я большой поклонник angular, но у него появилось несколько сложных концепций с чрезвычайно тонкими различиями между ними, и это один из них.
Я просто хочу создать класс, который я могу использовать для создания пользовательских объектов в моих контроллерах и фабриках angular. Это, конечно, не должно быть так сложно, но я не могу понять, как это сделать. Я хочу иметь собственный класс ResultSet, который я могу создать для создания экземпляров ResultSet. Однако для жизни я не могу понять правильный синтаксис службы factory v. Для использования.
Это все, что я хочу:
ResultSet = function(dataSet){
this.filter = function(){
# filters and returns dataSet
# ...
}
}
а затем я хочу создать экземпляр ResultSet внутри контроллера и т.д.
MyApp.controller('pageCtrl', ['ResultSet', (ResultSet) ->
# ...
rs = ResultSet.new(dataToFilter)
Как создать службу, которая позволяет мне создавать экземпляры моего пользовательского объекта?
Кажется более правильным использовать службу angular, а не factory, поскольку служба возвращает экземпляр объекта (именно это я и хочу). Но я не могу понять, как это сделать...
Как я могу использовать службу для объявления моего пользовательского класса ResultSet
, а затем как мне создать экземпляр из него?
Ответы
Ответ 1
myApp.factory('ResulSet', function() {
function ResultSetInstance(dataSet) {
this.filter = function(){
// ...
}
}
return {
createNew: function(dataSet) {
return new ResultSetInstance(dataSet);
}
};
});
а затем
myApp.controller('pageCtrl', function(ResultSet) {
var someData = ...;
var rs = ResultSet.createNew(someData);
}
Изменить (от вопросника)
В эксперименте с этим я обнаружил, что вам даже не нужен метод createNew
.
myApp.factory('ResultSetClass', function() {
ResultSetClass = function(dataSet) {
this.filter = function(){
// ...
}
}
return ResultSetClass
});
работает нормально, а затем вы можете вызвать new ResultSetClass(args)
.
Примечание для тех, кто использует Coffeescript
Coffeescript вернет последнюю переменную или метод в вашем экземпляре класса, поэтому, если вы используете coffeescript (как общее правило), обязательно возвратите this
в конце определения класса
myApp.factory 'ResultSetClass', () ->
ResultSetClass = (dataset) ->
this.filter = () ->
# do some stuff
return this
return ResultSetClass
Если вы не возвращаете this
явно, вы обнаружите, что когда вы вызываете
myApp.factory 'ResultSetClass', () ->
ResultSetClass = (dataset) ->
this.filter = () ->
# do some stuff
тогда вы просто останетесь с последним, что возвращает coffeescript, который является методом filter
.
Ответ 2
Возможно, вы искали что-то вроде этого:
.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;
})
Из this сообщение Герт Хенгевельд.