2012-03-20 2 views

ответ

18

Насколько я знаю - none is fired. Функция Render пуста в исходном коде.

The default implementation of render is a no-op

Я бы порекомендовал просто запускать его вручную, когда это необходимо.

+1

приветствий, ваше решение работал для меня :) –

+7

@StefanSchmidt кстати. - попробуйте прочитать Backbone.js исходный код самостоятельно , это вполне читаемо. –

+1

да ... вот что я понял после твоего поста. прежде чем я немного испугался. kinda javascript noob: D –

-2
constructor: function(){ 
    Backbone.View.call(this, arguments);  
    var oldRender = this.render 
    this.render = function(){ 
     oldRender.call(this) 
     // this.model.trigger('xxxxxxxxx') 
    }  
} 

как этот http://jsfiddle.net/8hQyB/

+1

Для этого вам не нужно переписывать конструктор. – mate64

+0

Конструктор - это не главное. вы также можете запустить его вручную или использовать jquery $ .Deferred. @ cept0 – user873792

35

Я столкнулся с этой post, который кажется интересным

var myView = Backbone.View.extend({ 

    initialize: function(options) { 
     _.bindAll(this, 'beforeRender', 'render', 'afterRender'); 
     var _this = this; 
     this.render = _.wrap(this.render, function(render) { 
      _this.beforeRender(); 
      render(); 
      _this.afterRender(); 
      return _this; 
     }); 
    }, 

    beforeRender: function() { 
     console.log('beforeRender'); 
    }, 

    render: function() { 
     return this; 
    }, 

    afterRender: function() { 
     console.log('afterRender'); 
    } 
}); 
+1

Зачем вам нужна эта строка: '_.bindAll (это, 'beforeRender', 'render', 'afterRender');'? – pilau

+2

@pilau - см. [This] (http://blog.bigbinary.com/2011/08/18/understanding-bind-and-bindall-in-backbone.html) для понимания _.bind и _.bindAll. Это помогло мне, надеюсь, это тоже поможет. – arunkjn

+1

Я знаю, что он делает, я спрашиваю, зачем вам вообще нужно использовать его, поскольку они (функции) все равно расширяют объект вида? – pilau

22

Или вы можете сделать следующее, что и код Backbone должен выглядеть (шаблон Observer, aka pub/sub). Это путь:

var myView = Backbone.View.extend({ 
    initialize: function() { 
     this.on('render', this.afterRender); 

     this.render(); 
    }, 

    render: function() { 
     this.trigger('render'); 
    }, 

    afterRender: function() { 
    } 
}); 

Edit: this.on('render', 'afterRender'); не будет работать - потому что Backbone.Events.on принимает только функции. Волна .on('event', 'methodName'); сделана возможной Backbone.View.delegateEvents и как таковая доступна только с событиями DOM.

+0

Uncaught TypeError: Object afterRender не имеет вызова метода ' – Trip

+1

@Trip Исправлено. Не думал, что это имеет значение, но, видимо, оно не работает с именем метода в одиночку. Теперь я должен выяснить, почему. – pilau

+0

Я обновил свой ответ, надеюсь, кто-то найдет его полезным. – pilau

-1

Вместо добавления обработчика событий вручную для рендеринга при иналинизации вы также можете добавить событие в раздел «События» вашего представления. См. http://backbonejs.org/#View-delegateEvents

например.

events: { 
    'render': 'afterRender' 
} 

afterRender: function(e){ 
    alert("render complete") 
}, 
+0

Это не работает. События делегата относятся к событиям, которые происходят в dom. Не обратные вызовы на самом объекте представления. – louism2

+0

'events' используется для' декларативных обратных вызовов для событий DOM', см. [Backbone/# View-delegateEvents] (http://documentcloud.github.io/backbone/#View-delegateEvents) – RainChen

2

Если вам случится использовать Marionette, кукольный добавляет show и render события в представлениях. См. Пример this StackOverflow question.

На стороне записки, кукольный добавляет много других полезных функций, которые вы могли бы быть заинтересованы в