您的 findAll 不应该将页面和部分 ID 硬编码到 GET 字符串中,因为这会使您的 can.Model 特定于该页面。您调用 findAll 的代码应该提供这些。
can.Model 子类表示您从服务器获取的一种数据。findAll 旨在检索该类型的一些对象。您的 GET 字符串似乎想要返回商店。我们可以将您的模型称为 WebStore(我避免使用“Store”,因为该词在 CanJS 中具有不同的含义)。
can.Model.extend("WebStore", {
findAll : "GET /api.php/stores-for-you?max_fav=3&max_reco=3"
}, {});
在您的 findAll 规范中,我们保留了一些分页键(max_fav 和 max_reco 似乎是结果限制器),因此其他代码无法同时请求 3000 个结果。但是,其他的是针对特定页面的。它们实际上是查询。如果您将它们放入您的 findAll 规范中,您的模型只能检索该页面,从而限制了它的可重用性。
所以现在在其他代码中,可能是控制器原型 init():
var ws_ajax = WebStore.findAll({ pid : 977, sid : 5938 });
ws_ajax.done(function(stores) {
//Handle the array of 0-3 stores returned from the server.
});
因此,现在您可以稍后在其他代码中调用其他页面和部分,只需使用不同的 pid 和 sid 值进行相同的调用。您无需尝试破解 findOne 以获得不同的页面。
但是......如果由于某种原因您经常使用该特定页面/部分组合,您可能会考虑在您的 WebStore 模型的静态属性上使用另一个函数,然后它看起来像这样:
can.Model.extend("WebStore", {
findAll : "GET /api.php/stores-for-you?max_fav=3&max_reco=3",
findMyPage : function() {
return this.findAll({ pid : 977, sid : 5938 });
}
}, {});
注意 findMyPage 在 CanJS 中没有特殊含义。如果这些值发生变化,您只需将 findAll 与常用值包装起来,以节省您过多的键入和维护问题。
留给读者的一个练习是实现“findMyOtherPage”,它会找到……你的另一个页面。
编辑:应要求添加更多细节。