Как передать параметры при использовании ресурса?
Очень новичок-вопрос:
Я пытаюсь создать объект ресурса с помощью метода factory:
.factory('Magazines', [function ($resource) {
var url = document.URL;
var urlArray = url.split("/");
var organId = urlArray[urlArray.length-1];
return $resource('http://localhost/ci/api/magazines/:id', {
loginID : organEntity,
password : organCommpassword,
id : organId
});
}])
Этот метод прост, потому что все параметры предопределены, organEntity и organCommpassword определены внутри тега.
Теперь для другого ресурсного объекта мне нужно передать параметр при вызове factory.
Я предполагаю, что вызывающий код этого ресурса должен выглядеть так:
.controller('ResrouceCtrl', function($scope, Magazines) {
$scope.magazines = Magazines.query();
});
Я знаю, что метод query() может добавлять параметры: Magazines.query(params, successcb, errorcb);
Интересно, если я просто передаю параметры, могу ли я получить параметр в factory? Как указать такие переданные в параметрах метода factory?
Например, теперь предположим, что я больше не могу получить organId из url, мне нужно передать его с моего контроллера, как получить метод в методе factory?
Вот мой ресурс js:
.factory('MagComments', function ($resource) {
return $resource('http://localhost/dooleystand/ci/api/magCommenct/:id', {
loginID : organEntity,
password : organCommpassword,
id : '@magId' //pass in param using @ syntax
});
})
Вот мой контроллер:
$scope.magComments = MagComments.query({magId : 1});
Я попытался передать параметр, но он вызывает ошибку
Ответы
Ответ 1
Я думаю, что я вижу вашу проблему, вам нужно использовать синтаксис @
для определения параметров, которые вы пройдете таким образом, также я не уверен, что делает loginID или пароль, вы, кажется, не определяете их нигде и они не используются в качестве параметров URL, поэтому они отправляются в качестве параметров запроса?
Это то, что я могу предложить, основываясь на том, что я вижу до сих пор:
.factory('MagComments', function ($resource) {
return $resource('http://localhost/dooleystand/ci/api/magCommenct/:id', {
loginID : organEntity,
password : organCommpassword,
id : '@magId'
});
})
Строка @magId
сообщит ресурсу заменить :id
свойством magId
на объект, который вы передаете ему как параметры.
Я бы предложил прочитать документацию здесь (я знаю, что это немного непрозрачно) очень внимательно и, глядя на примеры в конце, это должно многое помочь.
Ответ 2
Я предлагаю вам использовать provider
.
Предоставить хорошее, когда вы хотите сначала настроить его перед использованием (против службы / Factory)
Что-то вроде:
.provider('Magazines', function() {
this.url = '/';
this.urlArray = '/';
this.organId = 'Default';
this.$get = function() {
var url = this.url;
var urlArray = this.urlArray;
var organId = this.organId;
return {
invoke: function() {
return ......
}
}
};
this.setUrl = function(url) {
this.url = url;
};
this.setUrlArray = function(urlArray) {
this.urlArray = urlArray;
};
this.setOrganId = function(organId) {
this.organId = organId;
};
});
.config(function(MagazinesProvider){
MagazinesProvider.setUrl('...');
MagazinesProvider.setUrlArray('...');
MagazinesProvider.setOrganId('...');
});
И теперь контроллер:
function MyCtrl($scope, Magazines) {
Magazines.invoke();
....
}