Я хочу создать функцию $ saveOrUpdate, которая примет успешный обратный вызов, и я хочу использовать эту функцию в экземпляре моей службы ресурсов $ resource, а не распространять сама услуга.
Поэтому, если я хочу расширить службу, я просто пишу что-то в этих строках:
angular
.module('company-registry.company')
.factory('Company', Company);
Company.$inject = ['$resource'];
function Company($resource) {
var companyService = $resource("https://api.mongolab.com/api...", { update: { method: 'PUT' } });
angular.extend(companyService, {
saveOrUpdate: function(company, successCallback) {...}
});
return companyService;
}
Это создает функцию saveOrUpdate для фактической службы, но я хочу, чтобы следующий код работал:
var company = new Company();
company.$saveOrUpdate(cb);
У меня есть два вопроса:
так как мой метод $ saveOrUpdate должен будет вызвать $ save или $ update в моей компании, как мне ссылаться на объект, на который вызывается функция?
Как расширить методы, доступные в экземплярах моего сервиса?
Попробуй это:
function Company($resource) {
var companyService = $resource("https://api.mongolab.com/api...", { update: { method: 'PUT' } });
return angular.extend({
"$saveOrUpdate":function(cb){
...
}
}, companyService);
}
Изменение: изменения, сделанные на основе комментариев. Взгляните на эту скрипку. Это имеет смысл? Порядок объекта в методе extend
имеет значение. Зависит от того, хотите ли вы добавить новые свойства к существующему объекту или создать новый, расширив другой. Вы можете самостоятельно ссылаться на Company
используя this
как показано в примере.
return angular.extend({
hello: function (text) {
console.log(text);
return text + " - OK";
},
saveOrUpdate: function (successCallback) {
var response = this.hello("Foo Bar!");
return successCallback(response);
}
}, companyService);
new Company()
?