如何调用Backbone Collection中的方法

时间:2015-07-08 01:07:58

标签: javascript backbone.js

我是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'

感谢任何帮助。

3 个答案:

答案 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