[关闭]
@xzkcz 2014-08-17T23:02:14.000000Z 字数 7081 阅读 2407

Talent JS文档 v0.2


ItemView

简述

用于简单地渲染一个模板。
其render方法会将模板与数据绑定,并将结果渲染至$el中。

使用示例

  1. MyView=Talent.Itemview.extend({
  2. template: jst['home/index-page']
  3. });

属性

ui

一组hash表,获取view对应模板内的dom元素。
如下例所示,render前,this.ui.checkbox为字符串;render后,为jquery对象。

  1. ui:{
  2. checkbox:"input[type=checkbox]"
  3. },
  4. ,events:function(){
  5. var events = {};
  6. events['click ' + this.ui.checkbox] = 'clickHandler';
  7. return events;
  8. }
  9. onRender: function() {
  10. if (this.model.get('selected')) {
  11. this.ui.checkbox.addClass('checked');
  12. }
  13. }

modelEvents

对model中发生的事件绑定相应的事件监听函数。

  1. modelEvents: {
  2. "change":"modelChanged"
  3. }

collectionEvents

对collection中发生的事件绑定相应的事件监听函数。

  1. collectionEvents: {
  2. "add":"modelAdded"
  3. }

方法

serializeData

该方法用于处理向模板中传入的数据,它的返回值必须为json对象。
ItemView传入的model或collection数据不适合直接渲染时,可用该方法。

  1. serializeData: function(){
  2. return {
  3. "some attribute": "some value"
  4. }
  5. }

方法回调

onRender

该方法在render后执行。你可以向其中加入你希望在view render之后执行的代码。

CompositeView

简述

包含一个模板和一个可迭代区域。可迭代区域中的每个条目由ItemView负责渲染。

使用示例

  1. var MyItemView = Talent.ItemView.extend({
  2. template : Talent._.template('<li><%=text%></li>')
  3. });
  4. Talent.CompositeView.extend({
  5. template : jst['common/todo-composite'],
  6. itemViewContainer : 'ul',
  7. itemView: MyItemView
  8. });

属性

itemView

用于指定渲染每个迭代条目的视图类,其必须是ItemView的子类;必选参数;

itemViewContainer

用于指定迭代区域。该方法指定一个DOM节点,用来包含所有迭代条目。必选参数。

itemViewOptions

从compositeView中传入到itemView中的参数。

  1. var MyItemView = Talent.ItemView.extend({
  2. initialize: function(options){
  3. console.log(options.foo); // => "bar"
  4. }
  5. });
  6. Talent.CompositeView.extend({
  7. template : jst['common/todo-composite'],
  8. itemViewContainer : 'ul',
  9. itemView: MyItemView,
  10. itemViewOptions : {
  11. foo : "bar"
  12. }
  13. });

当itemViewOptions中的值需要在运行时通过计算得出时,它也可以被定义为一个函数,必须返回一个对象。

  1. Talent.CompositeView.extend({
  2. itemViewOptions: functioin(model, index){
  3. // 计算部分
  4. return {
  5. foo: "bar",
  6. itemIndex: index
  7. }
  8. }
  9. });

emptyView

collection为空时在compositeView内渲染的视图类。

children

获取compositeView中所有的itemView

方法

buildItemView

自定义itemView的实例化过程。

  1. buildItemView: function(item, ItemViewType, itemViewOptions){
  2. // 为ItemView构建最终的参数列表
  3. var options = _.extend({model: item}, itemViewOptions);
  4. // 实例化
  5. var view = new ItemViewType(options);
  6. return view;
  7. }

appendHtml

自定义itemView实例插入到dom结点的过程。
默认情况下,compositeView把每个itemView添加到缓存元素中,在最后通过jQuery的.append方法把所有itemView添加到compositeView的el中。

  1. Talent.CompositeView.extend({
  2. //第一个参数是compositeView实例,
  3. //第二个参数是当前itemView实例,
  4. //第三个参数itemView对应的model在collection中的序号。
  5. appendHtml: function(compositeView, itemView, index){
  6. if (compositeView.isBuffering) {
  7. //在事件重置和初始化渲染时缓存,减少向document插入元素的次数
  8. compositeView.elBuffer.appendChild(itemView.el);
  9. }
  10. else {
  11. //如果compositeView已经被渲染,
  12. //直接把新的itemView添加到compositeView中
  13. cmopositeView.$el.append(itemView.el);
  14. }
  15. }
  16. });

close

close方法执行以下操作 :

事件回调

onRender

view渲染完成后,对view对应的dom结构进行其它操作。

onClose

在view close后执行。

onBeforeItemAdded

item实例即将被添加到compositeView之前执行。

  1. onBeforeItemAdded: function(itemView){
  2. //操作代码
  3. }

onAfterItemAdded

item实例被添加到compositeView之后执行。

  1. onAfterItemAdded: function(itemView){
  2. //操作代码
  3. }

onItemRemoved

当item实例从compositeView中移除时执行。

  1. onItemRemoved: function(itemView){
  2. // 操作代码
  3. }

事件

以下事件函数在相应事件发生时被调用。

render

closed

before:item:added

after:item:added

item:removed

  1. MyView = Talent.CompositeView.extend({...});
  2. var myView = new MyView();
  3. myView.on("render", function(){
  4. alert("the collection view was rendered!");
  5. });
  6. myView.on("colsed", function(){
  7. alert("the collection view was closed!");
  8. });
  1. var MyCV = Talent.CollectionView.extend({
  2. // ...
  3. onBeforeItemAdded: function(){
  4. // ...
  5. },
  6. onAfterItemAdded: function(){
  7. // ...
  8. }
  9. });
  10. var cv = new MyCV({...});
  11. cv.on("before:item:added", function(viewInstance){
  12. // ...
  13. });
  14. cv.on("after:item:added", function(viewInstance){
  15. // ...
  16. });
  17. cv.on("item:removed", function(viewInstance){
  18. // ...
  19. });

Layout

简述

具有若干可局部刷新的区域(region)

使用示例

  1. MyLayout = Talent.Layout.extend({
  2. template: "#my-layout-template",
  3. regions: {
  4. menu: "#menu-bar",
  5. content: "#main-content"
  6. }
  7. });
  8. var myLayout = new MyLayout();
  9. myLayout.render();
  10. //myMenu在这里可以是ItemView或CompositeView的实例
  11. myLayout.menu.show(myMenu);

属性

regions

定义Layout中的Region。通过函数定义,该函数返回一个定义Region的对象。

  1. regions: function(options){
  2. return {
  3. fooRegion: "#foo-element"
  4. };
  5. }

方法

show

渲染view并将它添加到el元素中。

addRegion

向Layout中添加Region,一次只能添加一个。

  1. var layout = new MyLayout();
  2. // ...
  3. layout.addRegion("foo", "#foo");

addRegions

向Layout中添加Region,一次可以添加多个。

  1. var layout = new MyLayout();
  2. // ...
  3. layout.addRegions({
  4. foo: "#foo",
  5. bar: "#bar"
  6. });

removeRegion

移除Layout中的Region。

  1. var layout = new MyLayout();
  2. // ...
  3. layout.removeRegion("foo");

自定义Region Type

用于将默认的Region类替换为你自定义的Region类。

  1. MyLayout = Talent.Layout.extend({
  2. regionType: SomeCustomRegion
  3. });

也可以分别向每个region设置不同的Region类。

  1. AppLayout = Talent.Layout.extend({
  2. template: "#layout-template",
  3. regionType: SomeDefaultCustomRegion,
  4. regions: {
  5. menu: {
  6. selector: "#menu",
  7. regionType: CustomRegionTypeReference
  8. },
  9. content: {
  10. selector: "#content",
  11. regionType: CustomRegionType2Reference
  12. }
  13. }
  14. });

Region

简述

需要经常变动内部视图的区域。其最重要的特性为在改变内部视图后旧视图会从DOM中移除。

使用示例

  1. AppLayout = Talent.Layout.extend({
  2. template: "#layout-template",
  3. regions: {
  4. menu: "#menu",
  5. content: "#content"
  6. }
  7. });
  8. var layout = new AppLayout();
  9. layout.render();
  10. layout.menu.show(new MenuView());
  11. layout.content.show(new MainContentView());

属性

currentView

设置绑定到Region中的view。该view不会渲染或显示。

  1. var myView = new MyView({
  2. el: $("#existing-view-stuff")
  3. });
  4. var region = new Talent.Region({
  5. el: "#content",
  6. currentView: myView
  7. });

方法

show

渲染并将view添加到DOM树中。每次调用show方法时会自动调用close关闭旧view。可以通过{preventClose: true}参数阻止close行为。

  1. // 显示myView
  2. var myView = new MyView();
  3. MyApp.mainRegion.show(myView);
  4. // anotherView替换掉myView。自动调用close方法
  5. var anotherView = new AnotherView();
  6. MyApp.mainRegion.show(anotherView);
  7. // anotherView2替换anotherView。阻止调用close方法
  8. var anotherView2 = new AnotherView();
  9. MyApp.mainRegion.show(anotherView2, { preventClose: true });

reset

自动关闭所有显示的view并删除缓存的el元素。region下一次显示view时,el重新从DOM中获取。

open

改变视图添加到region中的过程。
默认的open方法为:

  1. Talent.Region.prototype.open = function(view){
  2. this.$el.empty().append(view.el);
  3. }

重写open方法添加其它效果

  1. Talent.Region.prototype.open = function(view){
  2. this.$el.hide();
  3. this.$el.html(view.el);
  4. this.$el.slideDown("fast");
  5. }

attachView

向Region中添加view,添加的view不会渲染或显示。

  1. MyApp.addRegions({
  2. someRegion: "#content"
  3. });
  4. var myView = new MyView({
  5. el: $("#existing-view-stuff")
  6. });
  7. MyApp.someRegion.attachView(myView);

事件

beforeShow

当view已经渲染完成,但是尚未添加到DOM中时调用。

show

view渲染完成并添加到DOM中后调用。

close

当view被关闭之后调用。

  1. MyApp.mainRegion.on("before:show", function(view){
  2. // manipulate the `view` or do something extra
  3. // with the region via `this`
  4. });
  5. MyApp.mainRegion.on("show", function(view){
  6. // manipulate the `view` or do something extra
  7. // with the region via `this`
  8. });
  9. MyApp.mainRegion.on("close", function(view){
  10. // manipulate the `view` or do something extra
  11. // with the region via `this`
  12. });
  13. MyRegion = Backbone.Marionette.Region.extend({
  14. // ...
  15. onBeforeShow: function(view) {
  16. // the `view` has not been shown yet
  17. },
  18. onShow: function(view){
  19. // the `view` has been shown
  20. }
  21. });
  22. MyView = Talent.ItemView.extend({
  23. onBeforeShow: function() {
  24. // called before the view has been shown
  25. },
  26. onShow: function(){
  27. // called when the view has been shown
  28. }
  29. });

实例化自定义Region

当我们想在应用运行之后向其中添加region时,就要按照上文中的方法扩展Region类,并在应用中实例化,如下所示:

  1. var SomeRegion = Talent.Region.extend({
  2. el: "#some-div",
  3. initialize: function(options){
  4. // your init code, here
  5. }
  6. });
  7. MyApp.someRegion = new SomeRegion();
  8. MyApp.someRegion.show(someView);

注意region必须要有一个元素与自身绑定,如果在添加region实例到应用或Layout中时没有指定选择器的话,在定义时也必须声明el属性。

添加自定义Region Types

通过addRegions将自定义Region Type添加到应用中。

  1. var FooterRegion = Talent.Region.extend({
  2. el: "#footer"
  3. });
  4. MyApp.addRegions({
  5. footerRegion: FooterRegion
  6. });

也可以在添加时声明一个选择器。

  1. var FooterRegion = Talent.Region.extend({
  2. el: "#footer"
  3. });
  4. MyApp.addRegions({
  5. footerRegion: {
  6. selector: "#footer",
  7. regionType: FooterRegion
  8. }
  9. });
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注