2014-10-07 88 views
2

我的模板中有一个Ember.Select。这些选项从我从服务器获得的内容中填充。所有的选项都很好。但是当我想显示选定的值时,它会将属性设置为undefined。Ember.Select绑定设置为undefined

模板:

{#with this as context}} 
    {{#each}} 
    <tr> 
     <td>{{name}}</td> 
     <td>{{view Ember.Select content=context.types optionValuePath='content.id' optionLabelPath='content.name' value=type}}</td> 
    </tr> 
    {{/each}} 
{{/with}} 

控制器:

types: function() { 
    return this.store.find('myType'); 
}.property() 

型号我通过循环:

DS.Model.extend({ 
    name: DS.attr(), 
    type: DS.attr() // <= this is the selected type (id) 
}); 

MyType的模型:

DS.Model.extend({ 
    name: DS.attr() 
}); 

此代码将呈现select元素中的所有选项。像这样:

<select> 
    <option value="1">My first type</option> 
    <option value="2">My second type</option> 
</select> 

下面的事情我不明白:

  • 当我检查我的数据(烬检查插件)的属性类型设置为undefined。
  • 但是,当我选择一个选项的类型属性设置为正确的ID。
  • 当我删除value=type时,在检查数据时,type属性具有正确的值。

jsbin: http://emberjs.jsbin.com/cugetoxoyira/3/edit

+0

你可以放在一起显示问题仓:http://emberjs.jsbin.com/ – tikotzky 2014-10-07 23:06:52

+0

加入jsbin:http://emberjs.jsbin.com/cugetoxoyira/3/编辑 – Klaasvaak 2014-10-08 07:39:24

回答

2

你有2个问题:

  1. 你选择含量限定到一个未了的灰烬,数据的承诺(这是一个奇怪的生物本身)。您可以通过在isFulfilled属性中进行if-ing来绕过这个问题。
  2. 这种模型的ID是字符串,而不是整数。

看看here的修复。

希望有所帮助。

+0

这确实解决了这个问题。你知道为什么当我将模型Stuff的属性类型改为:'type:DS.belongsTo('type')'。它不起作用了?请参阅:http://emberjs.jsbin。com/cugetoxoyira/39 /编辑 – Klaasvaak 2014-10-16 08:43:37

+0

不要错过DS.belongsTo问题。我忘了在select的值属性中添加type.id。 – Klaasvaak 2014-10-16 10:33:48

1

在控制器中使用模型承诺是反模式。路线的模型和afterModel挂钩等待,直到解决并实现了Promise。因此,当你的控制器和你的模板呈现时,来自商店和json API的所有数据都会被正确下载并设置。

“Ember Way”解决方案是在当前Route的setupController挂钩中设置两个模型,所以您不必在模板中使用破解。

http://emberjs.jsbin.com/cugetoxoyira/44/edit

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    return Ember.RSVP.hash({ 
     stuffs: this.store.find('stuff'), 
     types: this.store.find('type') 
    }); 
    }, 

    setupController: function(controller, model) { 
    controller.set('types', model.types);   
    controller.set('model', model.stuffs); 
    } 
}); 
+0

感谢您的回答。为什么在控制器中有一个anitpattern的承诺?与您的答案,我会遇到问题与视图使用渲染助手。 – Klaasvaak 2014-10-18 19:10:23

+0

在Route中,model和afterModel总是等到承诺解决。在控制器上,您必须使用它来管理它们。但是如果您的路线部分只有一个或两个主要模型,'Ember Way'将在Route而不是Controller中管理它们。你能举一个例子,你认为在哪里有问题? – Zoltan 2014-10-19 00:34:38

+1

问题是你不能像这样重复使用你的视图,因为你得到了模型钩子中的类型。当你使用渲染助手时,你可以传入一个模型。例如另一个'Stuff'列表。但是当你这样做时,控制器中的类型属性没有定义。也许更好的解决方案是为可用类型创建新视图,而不是将其放入控制器中。这个视图将负责获取所有可用的类型。 – Klaasvaak 2014-10-20 11:17:22