fish视觉组件

tech2026-01-01  3

0x00 视觉组件中的setView

   

var parentView = new ParentView().render(); // 1)setViews // 父视图的body节点插入ChildView1和ChildView2两个子视图 parentView.setViews({'.body': [new ChildView1(), new ChildView2()]}); // 父视图的body节点渲染ChildView1和ChildView2两个子视图 parentView.renderViews('.body');

    当使用以上代码渲染时,会出现这种情况

    可以看到多输出了一个child2,首先setView执行childView1()时只有一个‘.body’,然后就找到这个body并插入代码,然后执行childView2()时发现了两个'.body',于是便在两个地方各自插入了一次代码

0x01 视觉组件中的setView

    然后接着进行渲染

// 父视图渲染 var parentView = new ParentView().render(); // 1)setViews // 父视图的body节点插入ChildView1和ChildView2两个子视图 parentView.setViews({'.body': [new ChildView1(), new ChildView2()]}); // 父视图的body节点渲染ChildView1和ChildView2两个子视图 parentView.renderViews('.body'); // 2)setView // OtherView视图插入到父视图body节点(ChildView1和ChildView2被覆盖) parentView.setView('.body', new OtherView()); // 别忘了插入了视图后还需渲染视图 parentView.renderViews('.body');

 可以看到这里覆盖了之前的childView,但具体怎么覆盖的这里没有搞懂,等我搞懂了再修改此处

  后日补充:此处的覆盖应该是根据插入的子视图数量来覆盖,比如这里先插入了child1和child2,所以是插入了两个子视图,然后又setView插入otherChild,因为之前插入了两个子视图,这里只插入一个,所以第一个插入的child1被删掉了(保证视图数量)

0x02 视图通信

    视图之间通信一般不通过父视图传递参数来实现,因为这种方法耦合性较高。一般通过以下这种方法来实现

var ChildOneView = fish.View.extend({ el: false, template: fish.compile('<p>{{name}}</p>'), events: { 'click': '_onClick' }, serialize: { name: 'ChildOne' }, _onClick: function() { // 触发ChildTwoView的ChildTwoEvent方法 this.trigger('ChildTwoEvent',{message:'ChildOneView say goodbye to ChildTwoView'}) }, ChildOneEvent: function(data) { console.log(data.message); } }); var ChildTwoView = fish.View.extend({ el: false, template: fish.compile('<p>{{name}}</p>'), events: { 'click': '_onClick' }, serialize: { name: 'ChildTwo' }, _onClick: function() { // 触发ChildOneView的ChildOneEvent方法 this.trigger('ChildOneEvent', {message:'ChildTwoView say hello to ChildOneView'}) }, ChildTwoEvent: function(data) { console.log(data.message); } }); var template = '<div><p>{{name}}</p><div class="body"></div></div>'; var ParentView = fish.View.extend({ el: '#app-1', template: fish.compile('<div><p>{{name}}</p><div class="body"></div></div>'), serialize: { name: 'Parent' }, initialize: function() { this.childOne = new ChildOneView(); this.childTwo = new ChildTwoView(); // 将ChildOneView和ChildTwoView设为子视图 this.setViews({ '.body': [this.childOne, this.childTwo] }); // 在父视图内监听子视图通信 this.childOne.listenTo(this.childTwo, 'ChildOneEvent', this.childOne.ChildOneEvent); //第一个参数为other对象,第二个参数为other对象触发的事件,第三个参数为回调函数 this.childTwo.listenTo(this.childOne, 'ChildTwoEvent', this.childTwo.ChildTwoEvent); } }); var parentView = new ParentView().render();

0x03视图切换

    注意这里serialize的用法

var ChildView = fish.View.extend({ el: false, template: fish.compile('<p>{{title}}</p>'), serialize: function() { return { title: 'Child ' + this.options.index }; } }); // 定义三个子视图 var childViews = [new ChildView({ index: 1 }), new ChildView({ index: 2 }), new ChildView({ index: 3 })]; //定义父视图 var ParentView = fish.View.extend({ el: '#app-1', template: fish.compile('<div><p>{{name}}</p><div class="body"></div></div>'), serialize: { name: 'Parent' }, initialize: function() { this.setViews({ '.body': childViews }); } }); // 首先全部展示父视图与三个子视图 var parentView = new ParentView().render(); // 显示第一个子视图,隐藏其余子视图 parentView.navigateView('.body', childViews[0]); // 显示第二个子视图,隐藏其余子视图 parentView.navigateView('.body', childViews[1]); // 显示第三个子视图,隐藏其余子视图 parentView.navigateView('.body', childViews[2]);

0x04 弹出视图

    弹出视图函数

define([], function() { var template = '<div class="ui-dialog dialog-md">' + '<div class="modal-header"><h4 class="modal-title">{{title}}</h4></div>' + '<div class="modal-body">{{{content}}}</div>' + '</div>' var PopView = fish.View.extend({ el: false, template: fish.compile(template), events: { "click #close": "close" }, serialize: function() { return { title: this.options.title, content: '<p>do something here...</p><button class="btn btn-default" id="close">close</button>' }; }, initialize: function() { }, afterRender: function() { }, close: function() { this.trigger("close"); //弹出的视图实例会注入popup property,用于视图想自己关闭自己 this.popup.close(); }, cleanup: function() { } }); return PopView; });

    主页面直接调用

// 调用,假设`index.js`与`popView.js`为平级关系 fish.popupView({ url: './popView.js', width: "60%", viewOption: {title: 'I am title'}, //传参 close: function(data) { // data 为 popView.js 中 this.popup.close的参数 } });

另外注意,视图内不能使用全局$(),只能使用this.$()

最新回复(0)