Marionette ItemView 和单选按钮

Marionette ItemView and radio Buttons

我有从带有状态标志的服务器返回的数据。在每个 ItemView 上,我都有一些单选按钮,如下所示:

<td><input type='radio' name='<%- id %>-typeRecipe' value='0'></td> 
<td><input type='radio' name='<%- id %>-typeRecipe' value='2'></td> 
<td><input type='radio' name='<%- id %>-typeRecipe' value='1'></td>

在创建每个 ItemView 时,我想检查服务器返回的状态是否与输入值相同,即 0,1 或 2,以及是否将该元素设置为选中。

Recipe = Marionette.ItemView.extend({
   ui: {
     comm: 'input[type=radio]'
},

onBeforeRender: function () {
      for (var i = 0; i < this.ui.comm.length; i++) {
        if(parseInt(this.ui.comm[i].value, 10) === this.model.get('status')) {
          this.ui.comm[i].$el.prop('selected')
        }
      }
    }

但是,当我查看界面时 none 单选按钮已被选中。

当我调试代码时,我可以看到行 this.ui.comm[i].$el.prop('selected) 正在执行,所以我想知道为什么它不显示将元素设置为选中?顺便说一句,我也尝试在 onRender 事件上使用该函数,但结果相同

无线电输入是 checked 属性,而不是 selected。此外,您还需要将第二个参数设置为 true,以实际设置该 属性 的值,否则您只是得到它。

$('input.selectMe').prop('checked', true);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='radio' name='typeRecipe' value='0'>
<input type='radio' name='typeRecipe' value='2' class="selectMe">
<input type='radio' name='typeRecipe' value='1'>

我不同意你的做法,而不是有一个 onBeforeRender 函数,其整个功能是检查 "state" 并将其设置为已检查。我会将 "logic" 移动到模板中,而不在视图中处理它。

您的模板应该类似于:

<td><input type='radio' name='<%- id %>-typeRecipe' <% if (status == '0') { %>checked='checked'<% } %>value='0'></td> 
<td><input type='radio' name='<%- id %>-typeRecipe' <% if (status == '2') { %>checked='checked'<% } %>value='2'></td> 
<td><input type='radio' name='<%- id %>-typeRecipe' <% if (status == '1') { %>checked='checked'<% } %>value='1'></td>

最后是你的渲染器??哈哈。看起来像:

this.$el.html(this.template(this.model.toJSON()));

这又是 "my opinion",您可以按自己认为合适的方式处理它,但我喜欢它,因为那种平凡的逻辑使视图混乱,只会让您身后的人阅读比 [=26 更多的代码=] 也有。而且......我认为这种方法更 "elegant" 因为你正在进行的那个循环可以完全避免。