Canjs-扩展can.使用其他方法建模
Canjs - Extending can.Model with additional Methods
我不是第一个问这个问题的人。。。答案基本上是说"好吧,你做REST错了。"这很公平,但开发充满了权衡,我经常发现自己处于重写API的位置。
转到手头的问题,向模型中添加某个资源的方法最优雅的方法是什么?
var Issue = can.Model.extend({
findAll: 'GET Issues',
findOne: 'GET Issues/{id}',
findRelated: can.Model.makeFindAll(function(params) {
return can.ajax({
type: 'GET',
url: 'Issues/'+params.id+'/'
});
})
},{});
jsfiddle
如果我正确理解了这个问题,那么您需要从findRelated获得Issue.List
。
var Issue = can.Model.extend({
findAll: 'GET Issues',
findOne: 'GET Issues/{id}',
findRelated: function(params) {
var deferred = new can.Deferred();
can.ajax({
type: 'GET',
url: 'Issue/'+params.id+'/Related'
}).then(function(response) {
// success
deferred.resolve(Issue.models(response || []));
}, function(xhr, textStatus, err) {
// failure
deferred.reject(err);
});
return deferred;
}
},{});
jsfiddle
另一个选项类似于已接受的答案,是返回can.ajax
,而不是创建一个新的延迟。它不那么冗长了。
此外,从v2.1开始,不赞成将响应直接传递给.models
,最好先用.parseModels
进行转换。
var Issue=可以。型号扩展({findAll:"获取问题",findOne:"获取问题/{id}",findRelated:函数(问题){返回can.ajax({类型:"GET",url:'Issue/'+Issue.id+'/Related'}).然后(函数(响应){返回this.models(this.parseModels(response));}.bind(this));}}{findRelated:函数(){返回this.constructor.findRelated(this);}});//用法示例//1。Issue.findRelated({id:1});//2。new Issue({id:1}).findRelated();
jsfiddle
相关文章:
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- 如何从其他方法访问Angular.js$scope
- 停止内部事件处理程序冒泡的其他方法,jQuery
- 有没有办法将选择器返回到元素?是$(这个)还是其他方法
- 使用一个方法在c#中启动其他方法
- 使用appendchild或其他方法向ul添加html代码而不是纯文本
- 用Javascript或其他方法通过语音读取整个HTML页面(离线)
- 有没有其他方法可以在远程服务器上包含php文件?除了<?php include()>
- 为什么不't我的Javascript,如果其他方法有效的话
- 有没有办法使用画布或其他方法在 HTML 中制作圆形图像
- 无法获得其他方法是否可以在 HAML JavaScript 中正常工作
- 有没有其他方法可以在 jquery 中删除类
- 获取父对象并通过介于两者之间的窗体传递给其他方法
- 使用 jQuery 工具提示插件(或任何其他方法)显示带有 PHP 对象属性的工具提示
- 除了通过JavaScript追加之外,还有其他方法可以将动态数据添加到jQuery移动页面中吗?
- 有没有其他方法可以选择HTML元素
- 如何使用javascript或其他方法清除IE DNS缓存
- 是否可以使用 JQuery 或其他方法在两个浏览器窗口之间拖放一些内容
- 其他方法使用 setInterval 调用的方法无法访问 js 中的对象属性
- 在默认情况下将可枚举设置为 false 的 JS 中创建对象属性的其他方法是什么