2012-10-04 26 views
2

我正在ASP.NET MVC 4中使用backbone.js。Backbone.js中不同視圖的調用方法

我想從一個視圖中調用不同視圖的方法。爲了讓這個更簡單明瞭,我在下面創建了一個小例子。

在這裏,在MyView2在側OperationCompleted方法我想打電話給下面...

  • MyView的2呼叫myMethodB
  • MyView的1呼叫myMethodA
  • APPVIEW
  • 呼叫myMethodC

我該怎麼做?我暫時使用了諸如創建視圖對象和調用它們之類的東西。

像這樣的var view1 = new MyView1();然後view1.myMethodA();,必須有更好的方法,請幫我找到它。謝謝

var MyModel = Backbone.Model.extends({ 
}); 

// View for a Main Grid 
var MyView1 = Backbone.View.extend({ 
... 
myMethodA: function(){ 
// do something with View 1 
} 
... 
}); 


// View for subgrid in Main Grid 
var MyView2 = Backbone.View.extend({ 
... 
myMethodB: function(){ 
// do something with View 2 
}, 
OperationCompleted: function(){ 
// call myMethodB of MyView 2 
// call myMethodA of MyView 1 
// call myMethodC of AppView 
} 
... 
}); 

var AppView = Backbone.View.extend({ 
... 
myMethodC: function(){ 
// do something with App View 
} 
... 
}); 
+0

我沒有看到這個問題。如果你已經實例化你的視圖,他們應該可以通過它們的實例變量來訪問。 –

+0

你是否想找到一種很好的方式來溝通你的觀點?例如,某事發生了,'我想讓相關視圖知道我已更新'?或者你真的只是試圖從視圖實例中調用方法? –

+0

@Layoric是的是「一件事情發生,'我想讓相關的意見知道我已經更新'」,這是確切的情況 - – Yasser

回答

3

得到這個工作!只好用聚合模式,已粘貼的我是如何使用的一個樣本下面的例子...

Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events); 

var model = Backbone.Model.extend({ 
}); 

var view1 = Backbone.View.extend({ 
    initialize: function() { 
     this.eventAggregator.bind("doSomething_event", this.doSomething); 
    }, 
    doSomething: function(name){ 
     alert("Hey " + name + " !"); 
    } 
}); 

var view2 = Backbone.View.extend({  
    callToDoSomething: function(){ 
     self.eventAggregator.trigger("doSomething_event", "Yasser"); 
    } 
}); 

參考

https://stackoverflow.com/a/11926812/1182982

+0

我將分享的同樣的解決方案:)我建立了一個基本的回購具有半乾淨模式的骨幹應用程序(包括擴展Backbone.Events)。 https://github.com/Layoric/BackboneKickstart –

+0

感謝Layoric ... – Yasser

+0

你可能想看看Marionette充分實現這些模式和更多。 – dbrin

0

這裏另一種模式是調用視圖的功能通過觸發視圖所附的DOM元素上的事件。

例如:

var AppView = Backbone.View.extend({ 
    el: 'body', 
    events: { 
    'alertMe': 'alertMe' 
    }, 
    alertMe: function(ev, arg){ 
    console.log(args) 
    alert("You've been alerted!") 
    } 
}); 

然後在後面的代碼中(即使是在另一個視圖)的一些觀點:

// Shows an alert and prints object. 
$('body').trigger('alertMe', { foo: 'bar' });