backbone marionette 将变量传递给视图方法

backbone marionette pass variable to view method

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

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”。下一步我想通过 "data" 但现在我意识到我不能通过任何东西。

您丢失了 $.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
        ...
        },
    ...
});

由于您在 $.getJSON 的 return 上调用 renderProgress,您可以简单地提供对 return 的 done() 方法的函数引用编辑 jQuery 承诺。您的代码将如下所示:

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() [=12] 的一个版本=] 绑定到视图上下文:

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

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

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

var currentObj = this;

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

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

因为在你的例子中 this 指向该函数的当前对象而不是视图对象。