как правильно получить элемент из коллекции

В моем магистральном представлении я получаю модели из своей коллекции.

initialize:function(){
    this.collection = new collection(student);
    this.render();
},

из этой коллекции я фильтрую модели с высокой стоимостью, используя метод фильтрации: (при нажатии я запускаю)

getHighSocre:function(){
    return _.filter(this.collection.models, function(item){
         return parseInt(item.get('scored')) > 60
    })
},
showHighScore:function(){
    var hView = new studentView({model:this.getHighSocre()}); // sending to single view
    hView.showMe(); // I am calling this method to add a class name to each 'li' element..
}

вот мой единственный взгляд:

var studentView = Backbone.View.extend({
    tagName:'li',
    events:{
        'click':"called"
    },
    template:_.template($("#studentTemplate").html()),
    render:function(){
        this.$el.append(this.template(this.model.toJSON()));
        return this;
    },
    called:function(){
        if(this.model.get('scored') > 60){
            this.$el.css({
                background:"#EFEFEF"
            })
        }else{
            this.$el.css({
                background:"#FCBABA"
            })
        }

    },

    showMe:function(){ // I am passing here to add a class name

        console.log(this) // make the array... here

        this.$el.css({ // but this is not getting the dom element...
             border:'1px solid red'
         })
     }
});

Как добавить имя класса к каждому из этих li элементов? Что здесь не так, кто-нибудь может помочь мне отсортировать или дать мне правильный способ отфильтровать коллекцию и применить имя класса к ее элементу?

Вот jsfiddle.


person 3gwebtrain    schedule 27.04.2013    source источник
comment
Улугбек Комилович - почему вы убрали jsfiddle?   -  person 3gwebtrain    schedule 27.04.2013
comment
Вы не вызываете рендеринг в / до вызова функции showMe   -  person Scott Puleo    schedule 27.04.2013
comment
я извиняюсь за неправильные изменения, я изменил время, когда вы делаете изменения   -  person Ulug'bek Ro'zimboyev    schedule 27.04.2013
comment
Скотт Пулео - я немного запутался, не могли бы вы взглянуть на мой файл jsf..jsfiddle.net/3gwebtrain/2Tad7   -  person 3gwebtrain    schedule 27.04.2013


Ответы (1)


Во-первых, с Backbone и Underscore вы обычно не хотите вызывать методы Underscore для коллекций, например:

_.filter(this.collection.models, function(item){

вместо этого вы хотите вызвать эквивалентный метод Backbone Collection (http://documentcloud.github.io/backbone/#Collection-Underscore-Methods):

this.collection.filter(function(item){

Во-вторых, вы неправильно написали «score» как «socre»; не пытаюсь быть придурком, просто указываю на это, потому что такие орфографические ошибки могут легко вызвать ошибки.

В-третьих, представления ожидают модель для своего параметра модели, но ваш метод getHighSocre возвращает результат фильтра, т.е. массив моделей, поэтому эта строка:

new studentView({model:this.getHighSocre()});

не будет работать. Если вам просто нужна первая модель с оценкой выше 60, попробуйте использовать find вместо filter, и если вы действительно хотите, чтобы в вашем представлении были все модели с оценкой выше 60, тогда вы, вероятно, захотите преобразовать эти модели в новую коллекцию. и передайте это как коллекцию представления (а не как ее модель).

P.S.

На самом деле это не часть ответа, а просто примечание; если вы не знакомы с тернарным оператором Javascript, вы можете проверить его, поскольку он позволяет вам сократить все это:

    if(this.model.get('scored') > 60){
        this.$el.css({
            background:"#EFEFEF"
        })
    }else{
        this.$el.css({
            background:"#FCBABA"
        })
    }

чтобы просто:

var isAbove60 = this.model.get('scored') > 60;
this.$el.css('backgroundColor', isAbove60 ? "#EFEFEF" : "#FCBABA");
person machineghost    schedule 27.04.2013