我正在尝试使用sencha touch加载单个json对象。 当我使用数组时,一切都很好,但是我找不到将单个对象加载到Ext.data.Store中的方法
这是我正在尝试加载的示例:
{"person":{"name":"John","surname":"Fox"}}
它不起作用。 看了this条目后,
我尝试加载以下内容并且有效:
[{"person":{"name":"John","surname":"Fox"}}]
我的问题是:是否有一种方法可以加载[]? 为了做到这一点,我不得不修改我的服务器端代码,这让我感觉像代码味道...... 我希望能够加载一个json对象,而无需将其放入列表中。
这是我的Sencha Touch代理代码:
Ext.regModel("Person", {
fields: ['name','surname']
});
var store = new Ext.data.Store({
model : "Person",
autoLoad : true,
proxy: {
type: 'ajax',
url : 'my json url...',
reader: {
type: 'json',
record: 'person'
}
}
});
BTW - 我的服务器端代码在Ruby on Rails中。
答案 0 :(得分:9)
reader: {
type: 'json',
root: function(data) {
if (data.users) {
if (data.users instanceof Array) {
return data.users;
} else {
return [data.users];
}
}
}
}
通过简单地以root身份使用函数,您可以确保阅读器获取数组中的对象。
答案 1 :(得分:5)
更新:使用sencha访问单个json对象的方法只是发出一个简单的请求而不是使用数据存储。这是执行此操作的代码示例:
Ext.ns('myNS');
Ext.Ajax.request({
url: 'my url',
method: 'GET',
params: {
someParam: 'someValue'
},
success: function(result, request) {
var json = Ext.decode(result.responseText);
myNS.loadedPerson = json.person;
},
failure: function(result, request) {
Ext.Msg.alert('Error!', 'There was a problem while loading the data...');
}
});
如果你仍然坚持使用dataStore - 这是服务器端的一个可能的解决方案,它维护一个宁静的API: 这是我为了保持API安静所做的事情:
我添加了一个名为sencha的新MIME类型,其行为与json完全相同,但它也将json包装在[]括号中。
它可能(并且可能是)过度杀伤,但这样它对我的JSON API没有干扰。 这是新MIME类型的代码:
Mime::Type.register_alias "application/json", :sencha
#Add the renderer, and register a responder:
require 'action_controller/metal/renderers'
require 'action_controller/metal/responder'
# This is also how Rails internally implements its :json and :xml renderers
# Rarely used, nevertheless public API
ActionController::Renderers.add :sencha do |json, options|
json = ActiveSupport::JSON.encode(json) unless json.respond_to?(:to_str)
# Add [ ] around the response
json = "[#{json}]"
json = "#{options[:callback]}(#{json})" unless options[:callback].blank?
self.content_type ||= Mime::JSON
self.response_body = json
end
# This sets up a default render call for when you do
# respond_to do |format|
# format.sencha
# end
class ActionController::Responder
def to_sencha
controller.render :sencha => resource
end
end
这允许我在客户端定义以下代理(注意格式:'sencha'):
proxy: {
type: 'rest',
format: 'sencha',
url : my server url,
reader: {
type: 'json',
record: 'person'
}
}
这样我仍然可以保留一个安静的API,并将Sencha的json表示视为表示资源的另一种方式(即json / xml / yaml)
答案 2 :(得分:2)
不确定它是否是您想要的,但您可以通过以下模型加载它:
var oneperson = new Person({id: anId});
使用商店时,您总是必须发送一个数组,即使它只有一个记录。 我不知道为什么总是发送一个数组在你的应用程序中有问题,但它应该简单,只需强制参数为数组...
persons = [*persons]
答案 3 :(得分:0)
我同意 iwiznia ,Ext.data.Store总是等待响应,并且您可能应该更改服务器端代码以返回人员数组。
也许你也应该尝试使用服务器端和客户端代码的REST样式插件。