2013-10-09 3 views
2

Я пытаюсь найти модель в коллекции с атрибутом, равным значению опции выбора html.выпадение подчеркивания каждый

<div id="hospital-details"> 
    <select name="hospitalnames"> 
     <option><%- model.get('name') %></option> 
    </select> 
</div> 

всякий раз, когда название больницы изменяется, изменение JQuery обратного вызова вызывается для поиска locationModel с выбранным значением параметра в качестве значения атрибута, как показано ниже,

$('select[name="hospitalnames"]').change(function() { 
    var name = $(this).val(); 
    locationListCollection.each(function(locationModel) { 
    if ($.trim(locationModel.get('name')) == $.trim(name)) { 
     that.locationModel = locationModel; 
     return false; // control is returned to underscore.min.js 
    } 
    }); 
}); 
console.log(that.locationModel); // this is not being displayed at all 

После locationModel с атрибутом найден, я не может выйти из цикла. Любая помощь ? В этот момент я просмотрел this, но безуспешно.

ответ

9

Вы используете неправильный метод, если ищете первый матч. Коллекции имеют много Underscore methods mixed in, в частности, они имеют find смешанные в:

найти_.find(list, iterator, [context])

Смотрит через каждое значение в списке, возвращая первый, который проходит тест правды (итератора), или undefined, если значение не проходит тест.

Что-то вроде этого:

var name = $.trim($(this).val()); 
that.locationModel = locationListCollection.find(function(locationModel) { 
    return $.trim(locationModel.get('name')) == name; 
}); 

и если name s в вашей модели предварительно обрезается и красивым и чистым, то вы можете использовать findWhere:

findWherecollection.findWhere(attributes)

Точно так же, как w здесь, но прямо возвращает только первую модель в коллекции, которая соответствует пройденным атрибутам.

так:

var name = $.trim($(this).val()); 
that.locationModel = locationListCollection.findWhere({ name: name }); 

Кстати, это:

console.log(locationModel); 

не даст вам ничего, потому что locationModel и that.locationModel разные вещи.

+0

Лучший ответ, безусловно. – dthree

+0

+1 done, collection.findWhere (attributes) работал плавно :) – geekgugi

1

Попробуйте это,

var name = $(this).val(); 
var flag=true; 
locationListCollection.each(function(locationModel) { 
    if (flag && $.trim(locationModel.get('name')) == $.trim(name)) { 
    that.locationModel = locationModel; 
    flag=false; 
     //return false;// to break the $.each loop 
    } 
}); 
3

Вы всегда можете пойти Oldschool.

$('select[name="hospitalnames"]').change(function() { 
    var name = $(this).val(); 
    for (var i = 0; i < locationListCollection.length; ++i) { 
    var locationModel = locationListCollection.models[i]; 
    if ($.trim(locationModel.get('name')) == $.trim(name)) { 
     that.locationModel = locationModel; 
     break; 
    } 
    } 
}); 
+0

+1, нет ничего плохого с хорошей старой 'for' петли. –

+0

Я хотел ограничить использование только методов библиотек. Работает отлично ! +1 – geekgugi

0

Короткий нет.

Если вы посмотрите на источник подчеркивания, вы увидите, что они используют объект-выключатель, чтобы быстро остановить .each(), но это доступно только внутри.

Я бы не рекомендовал это, но вы всегда можете изменить источник, чтобы открыть этот объект-выключатель (см. Настройку базовой линии в аннотированном источнике http://underscorejs.org/docs/underscore.html). Затем вы просто вернете этот объект вместо того, чтобы возвращать false. Но вам, вероятно, нужно будет удалить встроенный вызов forEach, чтобы поддерживать постоянство поведения. Так что это не стоит!

_.each(function(arr) { 
    if(condition) { 
     return _.breaker; // Assuming you changed the source. 
    } 
}); 

Поскольку вы ищете для одного элемента вместо .each() использовать:

var locationModel = _.find(arr, function(item) { 
    return $.trim(locationModel.get('name')) == $.trim(name); 
)); 
+0

Я ищу locationModel в LocationListCollection, в этом случае arr будет locationListCollection? – geekgugi

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