2014-04-06 108 views
1

到目前为止,它看起来像Ember不像我预期的那样工作,我希望我错过了一些东西。我需要做的是迭代我的模型,由数组和对象组成的一组JSON,并构建出一个表单。当用户标记复选框时,控制器更新模型。ember.js属性绑定和事件对象

以下是我想要的工作......

<form {{action 'answerSupplied'}}> 
    {{#each model.questions}} 
     <h3>{{text}}</h3> 

     {{#each answers}} 
      {{input type='../type' answerId='id' data-bind-questionNum='../id' text}} 
     {{/each}} 

    {{/each}} 
    </form> 

以下是我能得到接近......

<form {{action 'answerSupplied' this}}> 
    {{#each model.questions}} 
     <h3>{{text}}</h3> 

     {{#each answers}} 
      {{formbuilder ../type id ../id text}} 
     {{/each}} 

    {{/each}} 
    </form> 
================== 
Handlebars.registerHelper('formbuilder', function(type, id, qnum, text, options) 
{ 
// console.log(options); 

    var q_type = options.contexts[0][type], 
     a_id = options.contexts[1].id, 
     q_number = options.contexts[0][qnum], 
     a_text = options.contexts[1].text; 

     return new Handlebars.SafeString(
       '<input type='+ q_type +' id='+ a_id +' name='+ 
        q_number +'>'+ a_text + '</input><br/>' 
     ); 
    } 
}); 

最大的问题机智,这是,我无法确定哪个元素被点击是因为我没有访问事件对象的权限。

我可以手动将动作绑定到“data-ember-action”之类的东西,并传入参数吗?或者,这是否远离Ember方式?

== ==更新

这里的上述JSFiddle,通过传递参数给Action提高。事件传播似乎在Action中停止,导致输入未正确标记。单选按钮松散了他们的分组,并且复选框没有被检查。

回答

2

灰烬可以很容易地处理你在这里做什么。首先保留范围并生成命名的每个循环更容易。

<form {{action 'answerSupplied'}}> 
    {{#each question in model.questions}} 
     <h3>{{question.text}}</h3> 

     {{#each answer in question.answers}} 
      {{input type=question.type answerId=answer.id data-bind-questionNum=question.id placeHolder=answer.text}} 
     {{/each}} 

    {{/each}} 
    </form> 

你可能不得不在你的输入语句周围做一些if语句。

http://emberjs.jsbin.com/zofoqeje/1/edit

+0

谢谢。这有很大帮助。我认为它应该以这种方式工作。我将无法测试,直到下班后,但它看起来像数据绑定属性是要传递给操作?如果这样的话,我会对Ember非常满意。 – nullsteph

+0

我能够得到更接近和传递参数与这个代码在名为'每个'循环:' {{answer.text}}
'...但是,事件被困在控制器中,复选框和单选按钮不会被标记。我如何让事件继续冒泡并检查复选框? – nullsteph