0

フェッチ要求を行うときに値を更新したいプロパティを持つビューがあります。

    define(['underscore','backbone','models/taskCollection'],
            function( _,Backbone,TaskCollection) {
            var UserTasksView = Backbone.View.extend({
                el:"#user-task-list",
                cur_task: undefined,
                initialize: function() {
                    this.collection = new TaskCollection;
                    this.model = this.collection._model;

                    _.bindAll(this,'render');
                    this.collection.bind('reset',this.render);
                },
view_task: function( event ) {

                var el = $(event.currentTarget);
                var task_id = el.attr('data-taskid');
                var row = el.parents('td').parents('tr.task-row');

                row.addClass("active");

                el.hide();
                el.next('a').show();

                var task = this.collection.fetch({
                    data: {id:task_id},
                    silent:true,
                    success:this._task_fetch_success
                });

                this._show_task_detail();

                event.preventDefault();
            },

            _task_fetch_success: function(response,status,xhr) {
                this.cur_task = JSON.stringify(status);
                return status;
            },

            /**
            * Displays the details of a task
            **/
            _show_task_detail: function() {
                var main = $('.app-content');
                var detail_view = $('.app-extra');
                var task_detail_view = $("#task-detail-view");

                //Reduce task list view width
                main.animate({
                    "width":"50%"
                },2000);
                //Display app extra bar
                detail_view.show();
                //show task detail  view
                detail_view.children('active-page').hide().removeClass('active-page').addClass('inactive-page');
                task_detail_view.show().removeClass('inactive-page').addClass('active-page');
                console.log(this.cur_task);
                var template = ich.task_detail(this.cur_task)
                $('div.task-details').html(template);
            }

フェッチによる ajax リクエスト トリガーは成功し、成功コールバックが実行されますが、「cur_task」プロパティをログに記録しようとすると、未定義として表示されます。私は何を間違っていますか

4

1 に答える 1

1

ここから始まるいくつかの問題があります。

var task = this.collection.fetch({
    data: {id:task_id},
    silent:true,
    success:this._task_fetch_success
});

そしてここ:

_task_fetch_success: function(response,status,xhr) {
    this.cur_task = JSON.stringify(status);
    return status;
}

まず第一に、successコールバックは jQuery 成功コールバックではなく、通常の jQuery パラメータを受け取りません。細かいマニュアルから:

引数として渡されるoptionsハッシュ テイクsuccessとコールバック。error(collection, response)

したがって、_task_fetch_success関数は期待どおりに呼び出されf(collection, response)ません。これが、パラメーターを JSON としてf(response, status, xhr)扱う必要がある理由です。は実際には.statusstatusresponse

次の問題は、それが関数this内にあると考えているものではないということです。_task_fetch_successバックボーンは単純な古い関数としてfetch呼び出すだけsuccessです:

  var success = options.success;
  options.success = function(resp, status, xhr) {
    collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);
    if (success) success(collection, resp, options); // <--------------- Right here
    collection.trigger('sync', collection, resp, options);
  };

つまり、あなたの意見ではなく、thisになりwindowます。この問題を回避する最も簡単な方法は、次のリストに追加_task_fetch_successすることです。_.bindAllinitialize

initialize: function() {
    //...
    _.bindAll(this, 'render', '_task_fetch_success');
    //...
}
于 2012-07-18T21:35:44.487 に答える