背景:我是Angular的新手,这感觉更像是“在AngularJS中做什么的正确方法”这样的问题。
我的API后端有几个相关对象,我需要请求并组装成一个连贯的用户界面。它可以建模为订阅中心的东西,所以我有:订阅hasMany Subscription_Items,belongsTo Source。
我想要做的是查找用户的订阅(/ api / subscriptions?user_id = 1),这给了我一些包含subscription_item_ids = [1,2,3 ...]数组的JSON。然后,我想查询这些ID,以及在source_id上查询服务器以获取共享信息,然后将所有内容重新打包到$ scope中,以便视图层可以轻松访问系统并且可以执行类似ng-repeat =外部ng-repeat =“订阅中的订阅”中的“subscription.subscription_items中的项目”。
从概念上讲,这是有道理的,我已经想到了加载这些链接数据的几种方法,但我很好奇的是:这里最好的做法是什么?我不想过度重新加载数据,所以看起来像一个普通的旧函数,每次看一个项目时都会做一个REST请求是一个坏主意,但与此同时,我不想只是推数据一次,然后错过项目更新。
所以,问题是:处理像这样的链接资源的最佳方法是什么,跟踪hasMany和belongsTo类型的连接到其他模型的方式与$ scope和$ apply循环中嵌入的思想一致?
答案 0 :(得分:4)
我喜欢使用延迟加载的dataModel
服务,它会缓存结果并返回promises。界面如下所示:
dataModel.getInstitution(institutionId).then(manageTheInstitution);
如果我需要一个孩子的东西,我称之为:
dataModel.getStudents(institutionId).then(manageStudents);
在内部,getStudents
看起来像这样:
function getStudents(institnutionId) {
var deferred = $q.defer();
getInstitnution(institutionId).then(function(institution) {
institution.students = Student.query({institutionId: institutionId});
institution.students.$promise.then(function(students) {
deferred.resolve(students);
});
});
return deferred.promise;
}
这些功能有点复杂。它们缓存结果,如果它们已经存在则不再请求它们...并返回或链接现有的承诺。他们也处理错误。
通过这种方式精心制作我的dataModel
服务,我可以管理任何资源嵌套,并且可以优化我的网络请求。到目前为止,我对这种方法非常满意。