2014-12-06 44 views
0

我得到了以下WorkSpec项目控制器,它控制复选框状态:在灰烬pushObject呼吁应该回调,但的removeObject不

ContractorApp.WorkSpecController = Em.ObjectController.extend 
    needs: ['account'] 
    selected: (-> 
    work_spec = @get 'content' 
    work_specializations = @get 'controllers.account.work_specializations' 
    work_specializations.contains work_spec 
    ).property() 

    selection_changed: (-> 
    work_spec = @get 'content' 
    work_specializations = @get 'controllers.account.work_specializations' 

    limit = @get 'controllers.account.specialization_limit' 

    if @get('selected') && work_specializations.get('length') < limit 
     work_specializations.pushObject work_spec 
    else 
     work_specializations.removeObject work_spec 
    ).observes('selected') 

正如你看到work_specializations是工作专业化的母公司集: 我想控制(work_specializations.get('length')< limit)添加一个元素到数组中。

在这里,我在模型中得到了观察者的问题包含work_specializations阵列:

ContractorApp.ContractorProfile = DS.Model.extend 
    work_specializations: DS.hasMany "work_specialization" 
    on_spec_change: (-> 
    ws_ids = @get('work_specializations').map (ws)-> 
     ws.get 'id' 
    @set('work_specialization_ids', ws_ids) 
).observes 'work_specializations' 

出于某种原因,“work_specializations.pushObject work_spec”的号召调用模型的回调,但其对应的removeObject没有。任何想法为什么?

+0

难道你不需要在调用'property'的时候声明'selected',尤其是'controllers.account.work_specialization'的依赖关系吗? – 2014-12-06 03:12:16

+0

@torazaburo不,道具绑定到控件的(checkbo)状态。此外,无论何时选中或取消选中框,都会成功调用selection_changed。问题是为什么即使'work_specializations.removeObject work_spec'被称为模型上的属性观察者不是 – 2014-12-06 03:48:08

回答

0

您正在观察集合本身,而不是正在添加或删除的项目。第一次改变很可能是触发观察员第一次开火。

on_spec_change: (-> 
    ws_ids = @get('work_specializations').map (ws)-> 
    ws.get 'id' 
    @set('work_specialization_ids', ws_ids) 
).observes 'work_specializations.[]' 
+0

谢谢。有一天,我将'.length'添加到'work_specializations',就像你做的一样,它同时适用于添加和删除。仍然不明白为什么它加入(不只是第一次!每次都按预期工作!) – 2014-12-08 02:19:52