2013-06-04 1 views
0

Мой код ниже, когда я запускаю его, он показывает ошибку - не имеет метода 'set'. Почему это происходит? Я переплетены свои функции модели, но это, кажется, работает неправильно (Почему <HTMLAudioElement> не имеет метода 'set'

var Player = Backbone.Model.extend({ 
    initialize: function(){   
     _.bind(this.ontimeupdate, this); 
     _.bind(this.onprogress, this); 
    },  
    setAudio: function(ogglink, mp3link, ontimeupdate){ 
     var el = document.createElement("audio");   
     el.addEventListener('timeupdate', this.ontimeupdate); 
     this.audiotag = el; 
    },  
    ontimeupdate: function() { 
     this.set("curtime", this.currentTime); 
    } 
}); 

ответ

1

В отличие от bindAll (который вы должны использовать, как вы сделаете несколько привязок), bind только returns the binded function (эквивалент bind метода ECMA в). Таким образом, ...

this.ontimeupdate = _.bind(this.ontimeupdate, this); 
this.onprogress = _.bind(this.onprogress, this); 

Или

_.bindAll(this); 

Или

_.bindAll(this, 'ontimeupdate', 'onprogress'); 
+0

таким образом убивают ошибки, но игрок работает неправильно в настоящее время. , когда я нажимаю на игру, песня начинает играть только в 3 раза –

+0

Да, но вам лучше открыть другой вопрос, это еще одна тема ... – Loamhoof

0

Если вы связываете эти методы к this (экземпляру игрока), то ваш метод ontimeupdate должен выглядеть примерно так:

ontimeupdate: function() { 
    this.set("curtime", this.audiotag.currentTime); 
} 
+0

Я пробовал этот путь, прежде чем спрашивать, проблема в том, что «это» а не экземпляр игрока, это содержимое переменной игрока 'audiotag' –

+0

Вам нужно привязать экземпляр к таким методам, как @Loamhoof сказал: '_.bindAll (это, 'ontimeupdate', 'onprogress')'. Тогда это сработает. – idbehold

+0

нет, это работает, но неправильно –