2014-10-08 3 views
0

Я пытаюсь переопределить конструктор Backbone.Model с моим собственным, чтобы иметь возможность передавать мои параметры извне, а не как созданный объект.Магистраль: невозможно переопределить конструктор

вот мой код:

var Video = Backbone.Model.extend({ 

constructor : function (videoUrl,imageSource,title,rating,description,starsImageSource){ 
    this.videoUrl = videoUrl; 
    this.imageSource = imageSource; 
    this.title = title; 
    this.rating = rating; 
    this.description = description; 
    this.starsImageSource = starsImageSource; 
    Backbone.Model.apply(this, arguments); 
    } 

}); 

при попытке ввести

new Video("www.yahoo","coins.jpg","Yahoo",4,"hhhh","5stars.png") 

следующее сообщение об ошибке появится: TypeError: недопустимый 'в' операнда OBJ вот мой включает в себя:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script> 
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js" type="text/javascript"></script> 
<script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js" type="text/javascript"></script> 
<script src="http://marionettejs.com/downloads/backbone.marionette.js" type="text/javascript"></script> 

спасибо!

+0

'Backbone.Model.apply (this, arguments)' недействителен. Вы должны использовать прототип Backbone.Model 'constructor' – hindmost

+0

BTW: Почему вы не используете метод' initialize'? Это позволяет также передавать/получать параметры – hindmost

+0

, как это сделать? –

ответ

1

Вам не нужно переопределять constructor.

Следующий код делает точно так же, что вам нужно:

var Video = Backbone.Model.extend({ 

initialize : function (videoUrl,imageSource,title,rating,description,starsImageSource){ 
    this.videoUrl = videoUrl; 
    this.imageSource = imageSource; 
    this.title = title; 
    this.rating = rating; 
    this.description = description; 
    this.starsImageSource = starsImageSource; 
} 

}); 
+0

все еще делает такую ​​же ошибку –

2

У вас есть две вещи, чтобы исправить:

  1. Как упоминалось ранее, предпочитают initialize над constructor

  2. Следуйте API new Model(attributes, options). Причина заключается в том, что основной аргумент будет принимать ваш первый аргумент и рассматривать его как хэш атрибутов. в случае, если это не объект, он может иметь неожиданное поведение. В этом случае вы можете иметь что-то вроде:

var Video = Backbone.Model.extend({ 
    initialize : function (attrs, options){ 
    _.extend(this, _.pick(options, 'videoUrl', 'imageSource', 'title', 'rating', 'description', 'starsImageSource')); 
    } 
}); 

new Video(null, { 
    videoUrl:"www.yahoo", 
    imageSource: "coins.jpg", 
    title: "Yahoo", 
    rating: 4, 
    description: "hhhh", 
    starsImageSource: "5stars.png" 
}); 

Один вопрос будет: почему вы хотите, чтобы назначить эти параметры в качестве первых параметров класса на модели объекта, а не в качестве атрибутов модели? В этом случае вам не нужно добавлять конструктор, просто для передачи данных:

new Video({ 
    videoUrl:"www.yahoo", 
    imageSource: "coins.jpg", 
    title: "Yahoo", 
    rating: 4, 
    description: "hhhh", 
    starsImageSource: "5stars.png" 
}); 
+0

большое спасибо. Я хочу добиться своего рода полиморфизма, я бы хотел наследовать от видео, тогда подкласс получит только URL-адрес, и теперь он будет получать и анализировать все остальные поля только с URL-адреса. –

Смежные вопросы