Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在backbone.js中从一个视图访问另一个视图中的函数_Backbone.js - Fatal编程技术网

在backbone.js中从一个视图访问另一个视图中的函数

在backbone.js中从一个视图访问另一个视图中的函数,backbone.js,Backbone.js,我的观点是这样的: window.templateLoaderView = Backbone.View.extend({}); window.PopupView = templateLoaderView.extend({ initialize: function () { this.PopupModel = new PopupModel(); this.event_aggregator.bind("tasks_popup:show", this.loadTas

我的观点是这样的:

window.templateLoaderView = Backbone.View.extend({});

window.PopupView = templateLoaderView.extend({
   initialize: function () {
       this.PopupModel = new PopupModel();
       this.event_aggregator.bind("tasks_popup:show", this.loadTaskPopup);
   },

   render: function() {
       template= _.template($('#'+this.PopupModel.templateName).html());
       $(this.el).html(template(this.PopupModel.toJSON()));
       $('#'+this.PopupModel.containerID).html(this.el);
   },

   loadTaskPopup: function() {
       this.PopupModel.loadTemplate("popupTask_templateHolder", "/js/templates/popup_task.html", "1", "container_dialog");
       this.render();
   }
});

window.TaskbarView = templateLoaderView.extend({

   initialize: function () {
       this.TaskbarModel = new TaskbarModel();
       this.PopupModel = new PopupModel();
   },

   loadTaskbarPopup: function() {
       this.event_aggregator.trigger("tasks_popup:show");
   }

});
所以我想在一个视图和另一个视图中运行函数。据我所知,我需要用某种方式把它们绑起来。可以在初始化函数中绑定它们吗

我在这里看到了一个例子:。它们创建两个对象,然后以某种方式绑定它们


提前感谢,

我有点喜欢使用“事件聚合器”模式。我确保每个视图都有一个相同事件聚合器对象的副本,并且它们都可以通过它相互通信。。。有点像CB收音机:)

在创建任何视图之前,请执行以下操作:

Backbone.View.prototype.event_aggregator = _.extend({}, Backbone.Events);
现在,您可以在任何地方发布/订阅:

window.PopupView = Backbone.View.extend({
    initialize: function() {
        _.bindAll(this, "loadTaskPopup");
        this.model = new PopupModel();
        this.event_aggregator.bind("tasks_popup:show", this.loadTaskPopup);
    },

    loadTaskPopup: function() {
        // do something with this.model
    }
});

window.TaskbarView = Backbone.View.extend({
    loadTaskbarPopup: function() {
      this.event_aggregator.trigger("tasks_popup:show")
    }
});

谢谢你,布莱恩,我试着按照你展示给我的方式来做,但我想因为我的模型和视图的结构,它不起作用。当我从TaskbarView访问此函数时,Firebug向我抛出此错误this.PopupModel未定义。你知道我怎么解决吗?知道。你的新问题与此无关。您尚未将
loadTaskPopup
函数绑定到对象的上下文中。查看我添加到
PopupView.initialize
.bindAll
调用。它将导致使用对象的上下文(
this
)调用
loadTaskPopup
,以便函数可以解析
这个.PopupModel
。我还想补充一点,从惯用的角度来看,您不应该创建名为
PopupModel
的属性,而应该是
model
。奇怪的是,你的模型正在加载一个模板。。。但我会让你自己解决这个问题。:)谢谢,布莱恩,成功了:)只有两个问题。如果一个视图有两个模型会怎么样?你怎么称呼它?模型加载模板的原因是,有一些函数可以从localStorage加载模板(如果没有,则可以从.html文件获取模板并将其保存到localStorage)。更多信息在这里:。你认为这不合逻辑吗?感谢您的帮助:)使用模型从本地存储加载数据当然是合乎逻辑的。即使这些数据恰好是一个模板。我不会太担心的。至于有两个模型,这通常表明您的视图做得太多了。通常情况下,视图所依据的是一个主模型。如果有另一种模式,它通常是为支持。我仍然会尽量保持一个
模型
,并把任何东西作为一个特殊的名字带进来。在您的代码中可能就是这种情况。。。我只是注意到一个常见的问题。。。但这并不意味着你一定是做错了。这有用吗?