2013-03-29 44 views
0

我有一个流星应用程序。它有一个简单的数据模型和编辑屏幕。型号如下:如何从流星视图的变化事件更新模型?

{ 
    _id: "some_id", 
    date: "date", 
    attempts: [{k1: "v1"}, {k1: "v2"}, {k1: "v1"}] 
} 

该模型存储在会话中。编辑界面organasied通过以下方式:

<template name="editModel"> 
    <form> 
     {{#each model.attempts}} 
      {{> attempt}} 
      <hr/> 
     {{/each}} 
    </form> 
    <button class="btn add-rep">Add</button> 
    <hr/> 
    <button type="submit" class="btn btn-primary submit-exercise">Submit</button> 
</template> 

<template name="attempt"> 
    <label>K1</label> 
    <select name="k1"> 
     <option {{selected k1 "1"}} >1</option> 
     <option {{selected k1 "2"}} >2</option> 
    </select> 
</template> 

attempt模板基本上就是下拉列表中,应该更新对象的​​财产。我写了下面的代码:

function keyChanged (e, t){ 
    t.data.k1 = t.find("[name='k1']").value; 
} 

Template.attempt.events = { 
    "change select[name='grip']" : keyChanged 
} 

但它不工作,因为data是只读的。问题是:我如何更新attempts数组中的那个对象?

回答

1

您尚未提供足够的详细信息继续您的收藏,但您可以直接更新收藏以更改模型数据,或者使用您用作模型引擎的内容来完成此操作。

E.g直接更新您的收藏(添加的东西到阵列):

Collection.update(id_of_record,{attempts : { $addToSet: {k1:"v9"} } }); 

因此,这将增加一个新的记录设定的。看看all the operations possible,对阵列MongoDB的文档,如$addToSet你可以暂时不考虑做的唯一的事情就是用$位置操作

只要你更新你收集相应的模板数据将更新使用反应性。我会小心一点,并使用{{#isolate}} & {{#constant}}和您的用例来确保呈现HTML附近的数据时不会重新绘制整个模板。请参见Reactivity Isolation & Constant Regions

+0

问题是,我不能改变已经添加的'尝试' – gor

+0

当然你可以!将它们解析为JavaScript对象,并根据需要更改它们,并使用{'$ set:{attempts:updated_attempts}}'来应用更新 – Akshat

+0

问题,是在更改事件处理程序中,我只有部分尝试收集,并且我甚至不知道它是数组中的索引。 – gor