Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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 Angular.js有效地访问和显示嵌套模型_Javascript_Ruby On Rails_Ajax_Angularjs_Relational Database - Fatal编程技术网

Javascript Angular.js有效地访问和显示嵌套模型

Javascript Angular.js有效地访问和显示嵌套模型,javascript,ruby-on-rails,ajax,angularjs,relational-database,Javascript,Ruby On Rails,Ajax,Angularjs,Relational Database,我现在正在构建一个站点,其中数据之间有许多关系链接。例如,用户可以进行预订,这将有预订者和预订者,以及可以附加到预订的消息数组 json的一个例子是 booking = { id: 1, location: 'POST CDE', desc: "Awesome stackoverflow description." booker: { id: 1, fname: 'Lawrence', lname: 'Jones', }, bookee: { id: 2,

我现在正在构建一个站点,其中数据之间有许多关系链接。例如,用户可以进行
预订
,这将有
预订者
预订者
,以及可以附加到
预订
消息数组

json的一个例子是

booking = {
  id: 1,
  location: 'POST CDE',
  desc: "Awesome stackoverflow description."
  booker: {
    id: 1, fname: 'Lawrence', lname: 'Jones',
  },
  bookee: {
    id: 2, fname: 'Stack', lname: 'Overflow',
  },
  messages: [
    { id: 1, mssg: 'For illustration only' }
  ]
}
现在我的问题是,你将如何在angular应用程序中建模这些数据?而且,虽然非常相关,但您将如何从服务器中提取它

在我看来,我有几个选择

立即从服务器中提取所有内容 在这里,我将依靠服务器序列化嵌套数据,并只使用给定的json对象。缺点是,我不知道在请求预订或类似对象时会涉及哪些用户,因此我无法缓存他们,因此每次请求时都会提取大量数据

使用booker/bookee作为用户
ids
为此,我将对我的数据模型使用承诺,并让服务器返回一个对象,例如

booking = {
  id: 1,
  location: 'POST CDE',
  desc: "Awesome stackoverflow description."
  booker: 1, bookee: 2,
  messages: [1]
}
然后我将其传递给
Booking
构造函数,该构造函数将通过各自的工厂将相关(
booker
bookee
message
)ID解析为数据对象

这里的缺点是许多ajax请求用于单个预订请求,尽管它使我能够缓存用户/消息信息


总之,依赖单个ajax请求一次收集所有嵌套信息是更好的做法,还是依赖各种请求在事后“充实”最初的响应


如果有帮助的话,我将使用Rails 4(也许Rails更适合于单个请求?

我将使用一个系统,通过为我的所有资源创建一个基类,该基类将被赋予一个自定义的
解析
函数,我希望在这个系统中,我能两全其美,这将知道该特定类中的哪些字段可能需要解析。示例资源函数如下所示

class Booking
  # other methods...
  resolve: ->
    booking = this
    User
      .query(booking.booker, booking.bookee)
      .then (users) ->
        [booking.booker, booking.bookee] = users
其中,它将
booker
bookee
字段的值传递给
用户
工厂,该工厂将具有如下构造函数

class User
  # other methods
  constructor: (data) ->
    user = this
    if not isNaN(id = parseInt data, 10)
      User.get(data).then (data) ->
        angular.extend user, data
    else angular.extend this, data
如果我向
User
构造函数传递了一个无法解析为数字的值(因此这将很乐意接受string
ids
和numeric),那么它将使用
User
factorys
get
函数从服务器检索数据(或者通过缓存系统,实现显然在
get
函数本身内部)。但是,如果检测到该值为非NaN,那么我将假设用户已经被序列化,并使用该值扩展它

因此,它在缓存方式上是不可见的,与服务器返回嵌套对象的方式无关。允许模块化ajax请求,并避免通过缓存系统重新下载不必要的数据


一旦一切就绪并开始运行,我将编写一些测试,看看应用程序是否可以更好地处理更大的、分块的ajax请求,还是上面提到的更小的模块化请求。无论哪种方式,这都可以让您通过Angle工厂传递所有模型数据,这样您就可以依靠每个记录继承了您可能想要使用的任何原型方法se.

我看到有人投票结束了这个问题,如果你能让我知道我能做些什么来改进它,我将不胜感激。这个问题有点太宽泛了,这就是为什么?你也没有说明你的堆栈。我假设说明堆栈似乎有点多余,因为这里的问题是客户端的,并且与一般http传输有关。看起来这是关于通过RESTFul界面生成ajax数据的,我认为这不是必需的。但是你说得对,我会尽量让它更具体。使用ngResource获取数据,它的声音就是你所需要的。也可以查看本教程->。如果还有其他问题可以问,我已经在同一个堆栈上做了同样的事情。我们e使用
活动模型序列化程序
也可以很容易地嵌套数据,然后在使用Angular获得数据时创建关系对象。