更改模型属性emberjs的值

时间:2015-05-07 15:13:24

标签: javascript ember.js ember-cli

我正试图在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。我知道我做了什么与控制器本身的属性一起工作,但我怎样才能在我的模型对象中实现这一点?

3 个答案:

答案 0 :(得分:3)

您是否尝试使用Ember.set()作为消息说明了?

Ember.set(m, 'showDetails', true);

http://emberjs.com/api/classes/Ember.html#method_set

答案 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
    });
});

More info about Ember.set

More info about #togglePropert