我试图在集合中找到一个属性等于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但没有成功。
答案 0 :(得分: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
已预先裁剪且干净整洁,那么您可以使用findWhere
:
像这样:findWhere
collection.findWhere(attributes)
就像 where 一样,但只直接返回集合中与传递的属性相匹配的第一个模型。
var name = $.trim($(this).val());
that.locationModel = locationListCollection.findWhere({ name: name });
console.log(locationModel);
不会给你任何东西,因为locationModel
和that.locationModel
是不同的东西。
答案 1 :(得分:3)
你可以随时去上学。
$('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;
}
}
});
答案 2 :(得分: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 :(得分: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);
));