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 使用带有主干木偶的现有渲染HTML显示视图_Backbone.js_Marionette_Backbone Views - Fatal编程技术网

Backbone.js 使用带有主干木偶的现有渲染HTML显示视图

Backbone.js 使用带有主干木偶的现有渲染HTML显示视图,backbone.js,marionette,backbone-views,Backbone.js,Marionette,Backbone Views,我有一个应用程序布局像一个附加。上面的面板已经在页面上(即在服务器的HTML响应中)。当用户与该面板中的元素交互时,下面的动态面板的内容会相应地改变 我研究了各种视图类型和区域管理器。但我还是想不出一个方法来实现这一点。我需要从已经呈现的元素中捕获事件,并相应地更改动态内容。据我所知,每次创建一个区域以显示一个特定的木偶视图时,该区域的内容都会被该视图的el替换。这样,我就不能对整个容器有一个布局视图 那么这可以用木偶来完成吗 您当然可以支持我所说的“预渲染”或局部视图。事实上,这里有一个我经常

我有一个应用程序布局像一个附加。上面的面板已经在页面上(即在服务器的HTML响应中)。当用户与该面板中的元素交互时,下面的动态面板的内容会相应地改变

我研究了各种视图类型和区域管理器。但我还是想不出一个方法来实现这一点。我需要从已经呈现的元素中捕获事件,并相应地更改动态内容。据我所知,每次创建一个区域以
显示一个特定的木偶视图时,该区域的内容都会被该视图的
el
替换。这样,我就不能对整个容器有一个
布局
视图

那么这可以用木偶来完成吗


您当然可以支持我所说的“预渲染”或局部视图。事实上,这里有一个我经常使用的木偶视图,因为我正在使用一个包含服务器端部分视图的应用程序:

My.PartialView = Backbone.Marionette.Layout.extend({
   render: function () {
      //noop
      if (this.onRender) {
         this.onRender();
      }
      return this;
   },
   onShow: function () {
       // make sure events are ready
       this.delegateEvents();
   }
});
使用起来很简单:

My.NavBar = My.PartialView.extend({
    events: {
        "change #search-input": "searchRequested",
        "click #faq-link": "faqRequested",
        "click #home-link": "homeRequested",
    },
    searchRequested: function (e) {
        // search
    },
    faqRequested: function (e) {
        // show the faq
    },
    homeRequested:function () {
        // go home
    }
});

var navbar = new main.views.NavBar({ el: ".my-nav" });
someRegion.show();
// or, just wire up the events manually
navbar.delegateEvents();

我认为更好的方法是使用构造函数。 创建渲染布局类

App.RenderedLayout = Marionette.Layout.extend({
    render: function () {
        if (this.onRender) {
            this.onRender();
        }
        return this;
    },
    constructor: function(){
        this._ensureElement();
        this.bindUIElements();
        Marionette.Layout.prototype.constructor.apply(this, slice(arguments));
    }
});
然后你就可以充分利用木偶的能力了

App.module('Some.Page', function (Mod, App, Backbone, Marionette, $, _) {

    Mod.SomeLayout = App.RenderedLayout.extend({
        el: '#renderedDiv',
        events: {
            'click .something': 'onSomethingClick'
        },
        regions: {
            'innerRegion': '#innerRegion'
        },
        ui: {
            something: '.something div'
        },
        initialize: function () {

        },
        onSomethingClick: function(e){
            return false;
        }
    });

    Mod.addInitializer(function(){
        App.addRegions({renderedRegion: '#renderedDiv'});
        Mod.someLayout = new Mod.SomeLayout();
        App.renderedRegion.attachView(Mod.someLayout);
    });

});

在布局视图中,您可以在视图内部设置多个区域,这样您就可以将菜单和内容分配给两个不同的区域,并让布局视图在它们之间调解事件。一种方法是创建一个控制器(可以是主干。视图用作“主控”页面上的视图。然后您可以将视图附加到面板上(希望您在面板最顶部的容器中有一个类或id,可以指定为面板的el)。从那里,您可以捕获面板中元素的单击或更改,然后触发自定义事件,直到主面板。然后主面板将“选择”显示哪个动态视图。这是一种策略模式方法。上面的示例中“someRegion”指的是什么?代码示例中没有声明。