2

我正在学习 Backbone.js 和 jQuery,以更新我的客户技能。我在渲染视图时遇到了一个障碍,我无法将偶数附加到子元素,同时在每个函数/循环中迭代它们。这是渲染功能的相关部分

var NavigationView = Backbone.View.extend({

    el: $('#nav-navigation')
    , firstRender: true
    , template: _.template($('#tpl-nav-organization').html())

    , initialize: function(){

        _.bindAll(this, 'render'); 
        this.collection.on('add', this.render);     
    }

    , render: function(){


        var $that = $(this);
        var proxy = $.proxy(this.navigateTo, this, 'parameter to navigateTo')

          // log point 1   
          console.log(proxy)

        $.each(this.el.children, function(index, child) {

            var navId = $(child).attr('id')
            if(navId !== undefined) {
                var navSelector = '#' + navId

                var proxy = $.proxy(this.navigateTo, $that, 'parameter to navigateTo')

                          // log point 2
                  console.log(proxy)

                $(navSelector).on('click',proxy);
            }
        })              


    }
    , navigateTo: function(id) {
        console.log(id)
    }
}) ;

在“日志点 1”处,我记录了一个有效的函数:

function () {
            return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
        } 

在“日志点 2”处,我记录了“未定义”。我试过这个

var $that = this

并在循环中传递它。这些都不起作用(没有双关语)。我意识到我的应用程序设计需要发展,但我试图在这种情况下理解这个问题。为什么不能为 NavigationView 类的 navigateTo 方法创建有效代理?

除了使代码工作的答案之外 - 我很想知道为什么。我怀疑在循环内部 this 对象是不同的上下文。但是为什么我不能事先存储该上下文并让它工作呢?

4

1 回答 1

1

这是因为在 $.each 循环内部this指向数组的当前索引的值,而不是你假设它指向的对象

var self = this;
$.each(this.el.children, function(index, child) {

        var navId = $(child).attr('id')
        if(navId !== undefined) {
            var navSelector = '#' + navId

            var proxy = $.proxy(self .navigateTo, $that, 'parameter to navigateTo')

                      // log point 2
              console.log(proxy)

            $(navSelector).on('click',proxy);
        }
    })   
于 2013-07-10T13:34:03.357 回答