我是Backbone.js的新手,甚至是Javascript的新手,不知道如何将我的问题放入短语中,我希望调用一个函数并将结果作为属性返回到同一个集合中。
var EnrollmentCollection = Backbone.Collection.extend({
url: "/some/prefix" + this.getPath() + "/some/suffix",
getPath: function() {
var result;
$.ajax({
type: 'GET',
url: '/this/is/a/url',
async: false,
dataType: 'json',
success: function(data) {
result = data[0].someattribute;
}
});
return result;
}
});
正如您所看到的,getPath()方法应该返回一个值作为url的值,但是,浏览器会出现以下错误:
未捕获的TypeError:无法读取undefined(匿名函数)的属性'getPath'
感谢任何帮助。
答案 0 :(得分:2)
使用您正在使用的代码:
url: this.getPath(),
您正在执行函数this.getPath()
,但它尚不存在,因为它定义如下。
尝试
url: (function(){
var result;
$.ajax({
type: 'GET',
url: '/this/is/a/url',
async: false,
dataType: 'json',
success: function(data) {
result = data[0].someattribute;
}
});
return result;
}())
答案 1 :(得分:1)
为您的收藏添加initialize
方法,并添加_.bindAll(this)
,如下所示:
initialize: function() {
_.bindAll(this);
}
添加上面的代码后,您现在可以像这样调用您的方法:
url: this.getPath();
答案 2 :(得分:1)
在上面添加@ MindTastic的答案,并启用async: false
(创建阻止ajax调用),我会考虑将getPath
方法移到url
上:
var EnrollmentCollection = Backbone.Collection.extend({
// doesn't need to be wrapped as 'url' accepts functions
url: function () {
var result;
$.ajax({
type: 'GET',
url: '/this/is/a/url',
async: false,
dataType: 'json',
success: function(data) {
result = data[0].someattribute;
}
});
return result;
}
});
有关详细信息,请参阅Backbone Docs - Collection URLs