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后,我无法退出循环。有什么帮助吗?目前我已经对此进行了调查 但没有成功。

4

4 回答 4

9

如果您正在搜索第一个匹配项,则您使用了错误的方法。集合中混入了很多下划线方法,特别是它们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

找哪里 collection.findWhere(attributes)

就像where一样,只是直接返回集合中与传递的属性匹配的第一个模型。

像这样:

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

顺便说一句,这个:

console.log(locationModel);

不会给你任何东西,因为locationModelthat.locationModel是不同的东西。

于 2013-10-09T05:05:38.217 回答
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;
     }
   }
});
于 2013-10-09T04:52:53.850 回答
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
  }
});
于 2013-10-09T04:51:32.730 回答
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);
 ));
于 2013-10-09T05:09:02.840 回答