2014-10-31 3 views
0

Я работаю с древовидной структурой, поэтому мне нужно делать некоторые красивые находки, когда я хочу работать от листьев до ствола, но я в основном пытаюсь создайте функцию, с помощью которой я могу передать функцию и применить/call/bind/something исходный контекст, чтобы я мог видеть переменные, которые у меня были изначально. Объяснение было бы удивительным.Javascript Scope Issue in Backbone Model/Collection

layerListView = Backbone.Marionette.CollectionView.extend({  
    updateSelectedModelsInTree: function() { 
     var col = myApp.request('someOtherCollection'); 
     this.collection.startFromLeaves(function (m) { 
      this.updateSelected(m); 
      // col is undefined in here 
     }, this); 
    } 
}); 
layerCollection = Backbone.Collection.extend({ 
    startFromLeaves: function (doToModel, context) { 
     if (!this.models) return; 
     for (var i = this.models.length - 1; i >= 0; i--) { 
      var model = this.models[i], 
       tag = this.models[i].get('tag'); 
      if (tag == 'branch') this.startFromLeaves(arguments); 
      doToModel.call(context, model); 
     } 
    } 
}); 

поэтому я застрял здесь, и все, что я хочу сделать, это быть в состоянии видеть переменную COL внутри верхней функции, которая передается в startFromLeaves. Я понятия не имею, как использовать call/bind/apply, но я предполагаю, что мой контекст - это то, что отбрасывает все.

+0

'col' должны быть видны там, вы уверены, что' MYAPP. request ('someOtherCollection') 'не возвращает' undefined'? –

+0

Он определенно возвращает коллекцию, которую она должна. это как раз то, что, как только я вхожу внутрь функции, которую я передаю в startFromLeaves, она не существует –

+0

Но 'col' захватывается закрытием, это не имеет никакого отношения к' this' или контексту или что-то в этом роде. Есть ли шанс на демонстрацию? Я предполагаю, что код в вашем вопросе не рассказывает всю историю. –

ответ

0

Заканчивать функцию связывания на underscore.js

Это позволяет передать функцию, которая имеет этот контекст установлен. Так, например, вы могли бы сделать

updateSelectedModelsInTree: function() { 
    var col = myApp.request('someOtherCollection'); 
    this.collection.startFromLeaves(_.bind(function (m) { 
     this.updateSelected(m); 
     // col is undefined in here 
    }, this)); 
} 

«это» внутри ваша функция будет теперь всегда будет «это», который содержит «updateSelectedModelsInTree»