Emberjs:将持久数据从远程 API 保存到本地存储
Emberjs: Save persistent data from remote API to local storage
我仍然对 Ember 从远程 API 获取数据并将其保存在浏览器中的方式感到困惑。
所以我创建了一个 REST 适配器,通过 Ajax 调用、序列化程序和相应的模型来获取记录集。假设他们是posts,我已经成功制作了一个posts的索引页面,用户可以点击任何post进入post详情页面。
Ajax 调用发生在索引页面上,使用 Ember 检查器,很明显所有记录都存储在本地存储中。
但是当我单击每个 post 详细信息页面上可用的 "back link" 时,它会重定向到 '/posts/' 但它似乎再次调用 ajax 。因此,所有 post 都从 API 中获取,再次使页面的响应速度大大降低。
这是我的问题:
- Ember 的那部分是如何工作的?我如何让 Ember 简单地从本地存储中获取记录而不用一次又一次地调用 Ajax? (除非用户刷新浏览器)
- 如果我向 'post/1' 发出 GET 请求,则没有数据可用,因为在这条路线中不应进行 Ajax 调用。但是我如何让数据显示出来呢?我是否应该为个人 post 设置另一个 REST 适配器,或者如果已进行 Ajax 调用,是否可以从本地存储获取记录?
希望这是有道理的,提前致谢!
更新:
我的 post 适配器:
App.PostAdapter = DS.RESTAdapter.extend({
findAll: function(store, type, sinceToken) {
var url = 'THE URL TO GET JSON BACK';
return $.getJSON(url).then(function(data) {
return posts;
})
}
});
我的Post和Post的路线:
App.PostRoute = Ember.Route.extend({
model: function(params) {
return this.store.find('post', params.postId);
}
})
App.PostsRoute = Ember.Route.extend({
model: function() {
return this.store.find('post');
}
})
关于你的第一个问题:这取决于你路由的模型回调。如果您使用商店的 all
method,则不会再次发出 Ajax 请求。 (但是:您有责任在第一时间获取数据。如果 all
没有 return 任何东西,您可能想将其侧载到某个地方或者可能想要调用 find
。这取决于您的应用程序。
关于您的第二个问题:RESTAdapter 应该可用于单个数据项和列表。您可以使用 find
. If you link-to
带有对象(而不是 ID)的路由在路由中实现模型挂钩,不会调用此挂钩。所以这个钩子只会在需要的时候被调用。
我仍然对 Ember 从远程 API 获取数据并将其保存在浏览器中的方式感到困惑。
所以我创建了一个 REST 适配器,通过 Ajax 调用、序列化程序和相应的模型来获取记录集。假设他们是posts,我已经成功制作了一个posts的索引页面,用户可以点击任何post进入post详情页面。
Ajax 调用发生在索引页面上,使用 Ember 检查器,很明显所有记录都存储在本地存储中。
但是当我单击每个 post 详细信息页面上可用的 "back link" 时,它会重定向到 '/posts/' 但它似乎再次调用 ajax 。因此,所有 post 都从 API 中获取,再次使页面的响应速度大大降低。
这是我的问题:
- Ember 的那部分是如何工作的?我如何让 Ember 简单地从本地存储中获取记录而不用一次又一次地调用 Ajax? (除非用户刷新浏览器)
- 如果我向 'post/1' 发出 GET 请求,则没有数据可用,因为在这条路线中不应进行 Ajax 调用。但是我如何让数据显示出来呢?我是否应该为个人 post 设置另一个 REST 适配器,或者如果已进行 Ajax 调用,是否可以从本地存储获取记录?
希望这是有道理的,提前致谢!
更新:
我的 post 适配器:
App.PostAdapter = DS.RESTAdapter.extend({
findAll: function(store, type, sinceToken) {
var url = 'THE URL TO GET JSON BACK';
return $.getJSON(url).then(function(data) {
return posts;
})
}
});
我的Post和Post的路线:
App.PostRoute = Ember.Route.extend({
model: function(params) {
return this.store.find('post', params.postId);
}
})
App.PostsRoute = Ember.Route.extend({
model: function() {
return this.store.find('post');
}
})
关于你的第一个问题:这取决于你路由的模型回调。如果您使用商店的 all
method,则不会再次发出 Ajax 请求。 (但是:您有责任在第一时间获取数据。如果 all
没有 return 任何东西,您可能想将其侧载到某个地方或者可能想要调用 find
。这取决于您的应用程序。
关于您的第二个问题:RESTAdapter 应该可用于单个数据项和列表。您可以使用 find
. If you link-to
带有对象(而不是 ID)的路由在路由中实现模型挂钩,不会调用此挂钩。所以这个钩子只会在需要的时候被调用。