来自Java世界我已经在我的视图中添加了自定义方法,但出于某种原因我不能在我的视图中调用它们。似乎Backbone.View.extend没有按照我期望的方式运行。
...
var TreeView = Backbone.View.extend({
el: '#org-tree',
initialize: function() {
eventBus.on("route:change", this.triggerFilterEvent);
this.listenTo(treeItems, 'sync', this.render);
treeItems.fetch({
reset: true
});
},
render: function() {
...
},
foo: function() {
console.log("foo");
},
triggerFilterEvent: function(name) {
this.foo();
...
}
});
...
以下代码将导致Uncaught TypeError: Object #<Object> has no method 'foo'
。
我注册为eventHandler回调的其他自定义方法triggerFilterEvent
正常工作。
1)为什么? 2)如何通过声明TreeView特定方法来重用代码?
答案 0 :(得分:1)
我认为问题是this
函数中的triggerFilterEvent
指的是eventBus
对象而不是您的视图。试试这个:
eventBus.on("route:change", _.bind(this.triggerFilterEvent, this));
这是方便的Underscore方法之一。更多信息here
答案 1 :(得分:1)
尝试
initialize: function() {
var self = this;
eventBus.on("route:change", self.triggerFilterEvent);
this.listenTo(treeItems, 'sync', this.render);
treeItems.fetch({
reset: true
});
}
答案 2 :(得分:1)
initialize: function() {
var self = this;
eventBus.on("route:change", function(){
// use "self" because in this scope "this" refers to "eventBus"
self.triggerFilterEvent();
});
// OR
this.listenTo(eventBus, 'route:change', this.triggerFilterEvent)
this.listenTo(treeItems, 'sync', function(){
this.render
});
},