JS-Data error: attrs must contain the property specified by idAttribute - with hasMany relations
JS-Data error: attrs must contain the property specified by idAttribute - with hasMany relations
错误如下:
http://puu.sh/lXzja/f773fb6c9a.png
我的用户模型的主键是用户名。我的路线的主键是路线名称。我的 api returns jsons inside data:{} 根据 jsonapi.org 规范。因此 id 属性不在顶层,正如 js-data 所要求的那样。这就是为什么我return data.data 在afterFind for 'users'。我试图在 'routes' 中做类似的事情,但它是一系列路线。
控制台登录 beforeInject 给我:
配置如下:
DS.defineResource({
name: 'users',
idAttribute: 'username',
basePath: apiEndpoint,
relations: {
hasMany: {
routes: {
localField: 'routes',
foreignKey: 'username'
}
}
},
// set just for this resource
afterFind: function(resource, data, cb) {
// do something more specific to "users"
cb(null, data.data);
}
});
DS.defineResource({
name: 'routes',
idAttribute: 'routename',
basePath: apiEndpoint,
cacheResponse: true,
relations: {
belongsTo: {
users: {
parent: true,
localKey: 'username',
localField: 'users'
}
}
},
beforeInject: function(resource, data) {
// do something more specific to "users"
console.log(data);
return data.data.routes;
}
});
这是我尝试加载我的路线但出现错误的地方:
resolve: {
user: function($route, DS) {
var username = $route.current.params.username;
return DS.find('users', username).then(function(user) {
DS.loadRelations('users', user.username, ['routes']).then(function(user) {
console.log(user);
}, function(err) {
console.log(err);
});
});
}
}
您的数据不仅嵌套在 "data" 字段下,而且嵌套在 "routes" 字段下。所以当你找到路线时,你试图注入类似的东西:
{
routes: [{
// foreignKey to a user
username: 'john1337',
// primary key of a route
id: 1234
}]
}
何时需要注射:
[{
username: 'john1337',
id: 1
}]
在您的路线资源上添加一个 afterFindAll
到 cb(null, data.data.routes)
。
您需要:
A) 向所有资源添加大量 "after" 挂钩或
B)使反序列化通用,以便它适用于所有资源。也许是这样的?
DS.defaults.afterFind = function (Resource, data, cb) {
cb(null, data.data[Resource.name])
};
DS.defaults.afterFindAll = function (Resource, data, cb) {
cb(null, data.data[Resource.name])
};
错误如下: http://puu.sh/lXzja/f773fb6c9a.png
我的用户模型的主键是用户名。我的路线的主键是路线名称。我的 api returns jsons inside data:{} 根据 jsonapi.org 规范。因此 id 属性不在顶层,正如 js-data 所要求的那样。这就是为什么我return data.data 在afterFind for 'users'。我试图在 'routes' 中做类似的事情,但它是一系列路线。 控制台登录 beforeInject 给我:
配置如下:
DS.defineResource({
name: 'users',
idAttribute: 'username',
basePath: apiEndpoint,
relations: {
hasMany: {
routes: {
localField: 'routes',
foreignKey: 'username'
}
}
},
// set just for this resource
afterFind: function(resource, data, cb) {
// do something more specific to "users"
cb(null, data.data);
}
});
DS.defineResource({
name: 'routes',
idAttribute: 'routename',
basePath: apiEndpoint,
cacheResponse: true,
relations: {
belongsTo: {
users: {
parent: true,
localKey: 'username',
localField: 'users'
}
}
},
beforeInject: function(resource, data) {
// do something more specific to "users"
console.log(data);
return data.data.routes;
}
});
这是我尝试加载我的路线但出现错误的地方:
resolve: {
user: function($route, DS) {
var username = $route.current.params.username;
return DS.find('users', username).then(function(user) {
DS.loadRelations('users', user.username, ['routes']).then(function(user) {
console.log(user);
}, function(err) {
console.log(err);
});
});
}
}
您的数据不仅嵌套在 "data" 字段下,而且嵌套在 "routes" 字段下。所以当你找到路线时,你试图注入类似的东西:
{
routes: [{
// foreignKey to a user
username: 'john1337',
// primary key of a route
id: 1234
}]
}
何时需要注射:
[{
username: 'john1337',
id: 1
}]
在您的路线资源上添加一个 afterFindAll
到 cb(null, data.data.routes)
。
您需要:
A) 向所有资源添加大量 "after" 挂钩或 B)使反序列化通用,以便它适用于所有资源。也许是这样的?
DS.defaults.afterFind = function (Resource, data, cb) {
cb(null, data.data[Resource.name])
};
DS.defaults.afterFindAll = function (Resource, data, cb) {
cb(null, data.data[Resource.name])
};