我正试图在Emberjs中为一些动态加载的数据实现切换效果。这是我的适配器:
charindex
以下是HTML把手:
export default Ember.Object.extend({
findAll: function(){
return ajax('http://localhost:8000/api/v1/address-book/companies?includes=details')
.then(function(response){
return response.data.map(function(c){
return {
name: c.name,
website: c.details.data.website_url,
dev_website: c.details.data.development_website_url,
showDetails: false
};
});
});
}
});
这是控制器:
{{#each m in model}}
<tr>
<td >
<p style="cursor:pointer; color:#009688" {{ action 'displayDetails' m}}>{{m.name}}</p>
{{#if m.showDetails}}
<div class="">
<p><strong>Wesbite URL: </strong><a href="{{m.website}}">{{m.website}}</a></p>
<p><strong>Development Wesbite URL: </strong><a href="{{m.dev_website}}">{{m.dev_website}}</a></p>
</div>
{{/if}}
</td>
</tr>
{{/each}}
我也在我的控制器中试过这个:
export default Ember.ArrayController.extend({
searchText: null,
actions: {
displayDetails: function(item){
item.toggleProperty('showDetails')
}
}
});
这给了我错误我必须使用Ember.set来更改属性显示的值然后我这样做了:
export default Ember.ArrayController.extend({
searchText: null,
actions: {
displayDetails: function(item){
item.showDetails = true;
}
}
});
但是这给了我错误export default Ember.ArrayController.extend({
searchText: null,
actions: {
displayDetails: function(item){
item.set('showDetails', true);
}
}
});
不是函数
现在,每次点击公司名称(p标签)时,我都会尝试将模型showDetails属性从true切换为false。我知道我做了什么与控制器本身的属性一起工作,但我怎样才能在我的模型对象中实现这一点?
答案 0 :(得分:3)
您是否尝试使用Ember.set()
作为消息说明了?
Ember.set(m, 'showDetails', true);
答案 1 :(得分:0)
你需要:
1)项目控制器(即将弃用)
- 调查&#39;需求&#39;控制器的api
2)可以设置属性的组件。
您无法使用阵列控制器为单个对象设置模型属性。
如果你有身份地图,你可以这样做:
actions: {
actionName: function() {
this.store.find('modelName', someID).toggleProperty('propertyName')
}
}
答案 2 :(得分:0)
在您的适配器中,您返回如下:
return response.data.map(function(c){
return {
name: c.name,
website: c.details.data.website_url,
dev_website: c.details.data.development_website_url,
showDetails: false
};
});
这意味着您将返回没有直接实现#set
方法的纯JavaScript对象数组。 Ember提供了可以在Ember对象和JavaScript对象上使用的Ember.set
。更重要的是,它符合Ember的绑定机制,可能这就是你收到警告的原因。
要在Ember环境中使返回对象更加灵活,请考虑将它们包装在Ember Object类中。这样您就可以直接实施#set
,#get
和#togglePropert
方法。举个例子:
return response.data.map(function(c){
return Ember.Object.create({
name: c.name,
website: c.details.data.website_url,
dev_website: c.details.data.development_website_url,
showDetails: false
});
});