Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将单个对象加载到sencha touch中的数据存储中_Javascript_Ruby On Rails_Json_Sencha Touch_Extjs - Fatal编程技术网

Javascript 将单个对象加载到sencha touch中的数据存储中

Javascript 将单个对象加载到sencha touch中的数据存储中,javascript,ruby-on-rails,json,sencha-touch,extjs,Javascript,Ruby On Rails,Json,Sencha Touch,Extjs,我正在尝试使用sencha touch加载单个json对象。 当我使用数组时,一切正常,但我还没有找到将单个对象加载到Ext.data.Store的方法 下面是我尝试加载的示例: {"person":{"name":"John","surname":"Fox"}} 它不起作用了。 看了入口, 我尝试加载以下内容,但效果良好: [{"person":{"name":"John","surname":"Fox"}}] 我的问题是:有没有一种方法可以通过[]加载它? 为了做到这一点,我不得不修改我

我正在尝试使用sencha touch加载单个json对象。 当我使用数组时,一切正常,但我还没有找到将单个对象加载到Ext.data.Store的方法

下面是我尝试加载的示例:

{"person":{"name":"John","surname":"Fox"}}
它不起作用了。 看了入口,

我尝试加载以下内容,但效果良好:

[{"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'
                }
            }
        });

顺便说一句-我的服务器端代码是Ruby on Rails。

不确定它是否是您想要的,但您可以通过如下模型加载它:

var oneperson = new Person({id: anId});
使用存储时,始终必须发送数组,即使其中只有一条记录。 我不知道为什么总是发送一个数组在你的应用程序中是有问题的,但它应该是简单的,只要强制参数是一个数组

persons = [*persons]

我同意iwiznia,Ext.data.Store总是等待[…]响应,可能您应该更改服务器端代码以返回人员数组

也许您还应该尝试使用REST风格的服务器端和客户端代码的内置操作。

更新:使用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...');
    }
});
如果您仍然坚持使用数据存储—以下是服务器端维护restful API的可能解决方案: 以下是我为保持API restful所做的工作:

我添加了一个名为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'
        }
    }

这样,我仍然可以保留restful API,并将Sencha的json表示作为表示资源的另一种方式(即json/xml/yaml)

Ext开发团队的Animal提供了这个非常有用的解决方案:

reader: {
    type: 'json',
    root: function(data) {
        if (data.users) {
            if (data.users instanceof Array) {
                return data.users;
            } else {
                return [data.users];
            }                    
        }                
    }
}

通过简单地使用一个函数作为根,您可以确保读取器获取数组中的对象。

我不需要在模型中指定代理,以便按照您提到的方式加载一个人吗?这对我来说是个问题,因为在默认情况下,将单个资源显示为数组不是RESTful的,这会弄乱我的json API…对不起,是的,您必须在模型中设置代理。我知道你要在RESTful上做什么了,难道你不能使用一个返回许多模型的操作吗?(例如索引)。这里的问题是,存储用于处理许多记录,因此将其指向只返回一条记录的RESTful url(即:show actions)是不符合逻辑的。好的,您可以在模型中使用单个资源和代理发布一个示例吗?这对我真的很有帮助(这就是我现在正在尝试做的…)我认为这就是我需要的。只要将代理的配置从存储移到模型上,它就会工作。我无法让它工作,因为它仍然需要一个数组。就我个人而言,我认为这是不可能的。。。最后,我在服务器端添加了一个新的响应程序类型。如果你有更好的解决办法,我很高兴听到。仅供参考-我尝试使用:Ext.ModelMgr.getModel('Person').load(123,{success:function(Person){console.log(Person.getId());}});对三天后,我的头撞到墙上,终于有了结果!非常感谢。