主干木偶传递变量查看方法

时间:2015-06-11 13:36:16

标签: javascript backbone.js marionette

我的情况简单,无法理解为什么我传递给函数的变量总是未定义。

var ProjectItemView = Backbone.Marionette.ItemView.extend({
        template: "#ProjectItemTemplate",

        initialize: function () {

            var id = this.model.get('project_id');

            $.getJSON('service/api.php/projects/' + id + '/progress').done(function (data) {

                 this.renderProgress('4'); //<== pass here
            });

        },

        renderProgress: function (why) {
            alert(why);  //<== undefined
        ...
        },
    ...
});

我希望它等于'4'。在下一步我想传递“数据”,但现在我意识到我无法传递任何东西。

3 个答案:

答案 0 :(得分:3)

由于您在renderProgress的返回时调用$.getJSON,因此您只需提供对返回的jQuery Promise的done()方法的函数引用。你的代码看起来像这样:

var ProjectItemView = Backbone.Marionette.ItemView.extend({
        template: "#ProjectItemTemplate",

        initialize: function () {

            var id = this.model.get('project_id');

            $.getJSON('service/api.php/projects/' + id + '/progress')
             .done(this.renderProgress);
        },

        renderProgress: function (data) {
            alert(data); 
        ...
        },
    ...
});

如果您需要renderProgress中的视图上下文(例如,要引用视图属性),请提供done()版本renderProgress&# 39;绑定到视图上下文:

$.getJSON('service/api.php/projects/' + id + '/progress')
 .done(_.bind(this.renderProgress, this));

其中_.bind是UnderscoreJS函数。阅读更多相关信息here

答案 1 :(得分:0)

你在$ .getJSON完成回调中松开了上下文。试试这个:

var ProjectItemView = Backbone.Marionette.ItemView.extend({
        template: "#ProjectItemTemplate",

        initialize: function () {

            var id = this.model.get('project_id');
            var _this = this;

            $.getJSON('service/api.php/projects/' + id + '/progress').done(function (data) {

                _this.renderProgress('4'); //<== pass here
            });

        },

        renderProgress: function (why) {
            alert(why);  //<== undefined
        ...
        },
    ...
});

答案 2 :(得分:0)

您无权访问“$ .getJSON”中的 this (“将此分配给任何变量,然后调用”renderProgress“方法。

var currentObj = this;

 $.getJSON('service/api.php/projects/' + id + '/progress').done(function (data) {

                 currentObj .renderProgress('4'); //<== pass here
            });

因为在你的情况下,这指向该函数的当前对象而不是查看对象。