Ответ 1
Вы не получите то, что хотите от запасных классов Ext, вам придется немного поработать...
Из того, что я понимаю, вам нужен идентификатор пользователя для загрузки его учетной записи, а не идентификатор самой записи учетной записи. Итак, я бы сконфигурировал ассоциацию, чтобы отразить это:
associations: [{
model: "MyApp.model.Account",
name: "account",
type: "hasOne",
reader: "json",
getterName: "getAccount",
setterName: "setAccount",
// foreignKey: "accountId"
foreignKey: 'id'
}],
Большим преимуществом здесь является то, что идентификатор пользователя будет доступен прокси, когда ему будет предложено создать URL-адрес для запроса.
Теперь, чтобы построить url с нужным вам форматом, мы должны заменить метод proxy buildUrl
. И, как вы уже обнаружили, вам нужен URL-адрес, чтобы получить этот метод в первую очередь.
Итак, вот как мне настроить прокси-сервер учетной записи:
proxy: {
type: "rest",
reader: {type: "json"},
// Give it an URL to avoid the error
url: '/rest/users/{}/account',
// Replace the buildUrl method
buildUrl: function(request) {
var me = this,
operation = request.operation,
records = operation.records || [],
record = records[0],
url = me.getUrl(request),
id = record ? record.getId() : operation.id;
// Here the part honoring your URL format
if (me.isValidId(id)) {
url = url.replace('{}', id);
} else {
throw new Error('A valid id is required');
}
// That enough, but we lose the cache buster param (see bellow)
return url;
// If we want the cache buster param (_dc=...) to be added,
// we must call the superclass, which will read the url from
// the request.
request.url = url;
return Ext.data.proxy.Rest.superclass.buildUrl.apply(this, arguments);
}
}
В этот момент мы получаем запрос об активации прокси на URL-адресах формы:
rest/users/45/account?id=45
Это только косметический, но этот параметр запроса id меня раздражает, поэтому я также заменил бы метод buildRequest
прокси-сервера следующим:
buildRequest: function(operation, callback, scope) {
var me = this,
params = operation.params = Ext.apply({}, operation.params, me.extraParams),
request;
Ext.applyIf(params, me.getParams(operation));
// if (operation.id !== undefined && params[me.idParam] === undefined) {
// params[me.idParam] = operation.id;
// }
request = new Ext.data.Request({
params : params,
action : operation.action,
records : operation.records,
operation: operation,
url : operation.url,
proxy: me
});
request.url = me.buildUrl(request);
operation.request = request;
return request;
}
И здесь вы... Хотя это сработает, я не рекомендую переопределять методы таким образом, в конфигурации прокси. В реальной жизни вы должны расширить свой собственный прокси-класс от Rest, особенно если вам нужно настроить многие такие прокси-серверы... Но я надеюсь, что дал вам все ингредиенты, которые вам нужно для начала!