fish视觉组件

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值