Ember设置属于第一次协会工作

时间:2014-10-08 17:48:31

标签: javascript jquery ember.js

此代码应为用户提供一个屏幕,以更新您的投资组合模板。

在此屏幕中,服务器始终返回5个模板,并且投资组合已经关联了一个模板。

模型

App.Portfolio = DS.Model.extend
  color: DS.attr 'string'
  template: DS.belongsTo 'template'


App.Template = DS.Model.extend
  title: DS.attr 'string'
  portfolios: DS.hasMany('template')

路线

App.PortfolioRoute = Ember.Route.extend
  setupController: (controller, model) ->
    this._super(controller,model);
    # load all templates for portfolio screen
    controller.set 'templates', this.store.find 'template' 

控制器

PortfoliosApplication.PortfolioController = Ember.ObjectController.extend
  selectedTemplate: null

  testTemplateSelection: (->
    @set 'model.template', @get('selectedTemplate')
    console.log @get 'selectedTemplate'
    console.log @get 'model.template'
    console.log '--------'
  ).observes 'selectedTemplate'

  actions:
    changeTemplate: (template) ->
      @set 'selectedTemplate', template

portfolio.hbs

{{#each tmpl in templates}}
  <button {{action 'changeTemplate' tmpl}}> {{ tmpl.title }} </button>
{{/each}}

<h3>Template {{ template.title }}</h3>

当用户为当前产品组合选择新模板时,此代码可以正常工作。例如:

  • 使用模板1打开投资组合
  • 更改为模板2
  • 保存

但如果选择之前选择的模板,则无效。例如:

  • 使用模板1打开投资组合
  • 更改为模板2
  • 再次更改为模板1 不起作用

在最后一个示例的第三步,屏幕没有更新,控制台记录:

selectedTemplate.id => 1
model.teplate.id => 2
-------- 

即,@set 'model.template', @get('selectedTemplate')没有更新template的{​​{1}}属性。

我陷入了这个错误。任何帮助?

2 个答案:

答案 0 :(得分:2)

这是Ember Data中的一个错误,已在主

中修复

https://github.com/emberjs/data/issues/2360

请参阅我的JSBin以重现问题

http://emberjs.jsbin.com/haweci/2/edit

您可以评论/取消注释Ember Data的版本并重现该问题。

此外,我必须修改您的代码才能使其正常工作:

  • 我正在使用RSVP.hashtemplates挂钩中加载portfoliomodel。您不应该致电store.find
  • 中的setupController
  • 我在portfolio加载PortfolioControllertemplates加载TemplatesController
  • 为了在templates模板中使用portfolio,我使用PortfolioController
  • TemplatesControllerneeds之间创建了依赖关系
  • 无需使用观察者在模型上设置模板,您可以直接在动作处理程序中执行此操作。

答案 1 :(得分:0)

App.Template needs属于App.Portfolo:

App.Portfolio = DS.Model.extend({
  color: DS.attr('string'),
  template: DS.belongsTo('template')
});

App.Template = DS.Model.extend({
  title: DS.attr('string'),
  portfolio: DS.belongsTo('portfolio'),
  portfolios: DS.hasMany('template')  
});

有关Cyril Fluck的jsbin的固定版本,请参阅here