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

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

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
Скот Пулео – малко съм объркан, можете ли да погледнете моя jsffile..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){

Второ, грешно сте написали "резултат" като "socre"; без да се опитвам да съм глупак, просто го посочвам, защото подобни правописни грешки лесно могат да причинят грешки.

Трето, изгледите очакват a модел за своя параметър на модела, но вашият 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