【问题标题】:Ember trying to update element gives this.get(...).save is not a functionEmber 试图更新元素给出 this.get(...).save 不是一个函数
【发布时间】:2015-04-12 14:16:34
【问题描述】:

我正在尝试学习 Ember,并且已经开始在我的后端服务器上读取和写入新元素。我在尝试更新时不知何故卡住了。

这是我的控制器

App.TeamController = Ember.ObjectController.extend({
editMode : false,
actions : {
    enterEdit : function() {
        this.set('editMode', true);
    },
    saveEdit : function() {
        this.set('editMode', false);
        this.get('model').save();
    }
}});

这是我的车把代码:

    {{# each team in model itemController="team"}}
    {{# if team.editMode}}
    {{input type="text" id="newName" value=team.name class="form-control"}}
    {{input type="text" id="newLevel" value=team.level class="form-control"}}
    <button {{action "saveEdit"}}>Save</button>
    {{else}}
     <p>{{team.name}} : {{team.level}} <button {{action 'enterEdit'}}>edit</button></p>
    {{/if}}
{{/each}}

这在控制台中给了我以下错误消息:

TypeError: this.get(...).save 不是函数。

我不知道出了什么问题。任何帮助表示赞赏。

编辑:

我的模特:

App.Team = DS.Model.extend({
name: DS.attr('string'),
level: DS.attr('string')

});

我的路线

App.TeamsRoute = Ember.Route.extend({
model : function() {
    var team = $.get('/teams/');
    team.then(function(data){
        console.log(data);
    });
    return team;
}});

【问题讨论】:

  • this.get('model').save(); 上设置断点并运行this.get('model') 会发生什么?是否返回模型?
  • 就像 Oren 建议您很可能没有模型一样,您的路线是什么样的?
  • 如果我设置断点我确实得到一个对象,它具有模型的所有值,它是:Object { id: 2, name: Getter, level: Getter, 2 more...},但它仍然给我 .save() 不是一个函数。
  • 我的路线看起来像: App.TeamsRoute = Ember.Route.extend({ model : function() { var team = $.get('/teams/'); team.then(function( data){ console.log(data); }); return team; } });

标签: ember.js ember-data


【解决方案1】:

我有一个类似的问题,我找到了一个非常“hacky”的解决方案。

代替:

model.save()

试试这个:

model.get('content').save()

这对我有用,尽管我并不热衷于解决方案。有没有人对这个问题有更清洁的解决方法?

【讨论】:

    【解决方案2】:

    您的模型似乎是一个实例数组,因为您正在循环它。您无法保存模型数组。相反,将当前模型传递给操作并保存该特定模型:

    <button {{action "saveEdit" team}}>  {{! pass team to action }}
        Save
    </button>
    

    然后保存该特定模型:

    saveEdit : function(model) {         // <== add parameter
        this.set('editMode', false);
        model.save();                    // <== save the specific model
    }
    

    【讨论】:

    • 这给了我与上面描述的完全相同的对象,它具有 Id、名称和级别,但保存不是对象的功能。
    • model 是不是数组,如果是,数组是什么,怎么创建的?
    • 我要做的是重新创建类似于此处示例的内容:link 首先有一个模型数组,然后将一个和一个传递给处理对象的控制器。
    【解决方案3】:

    我知道这是一个老问题,但问题实际上是由 this.get('model') 返回一个 promise 而不是 ember 数据模型引起的(因此 get('content') 有效)。清理此问题的最简单解决方案是将您的代码修改为以下

    App.TeamController = Ember.ObjectController.extend({
    editMode : false,
    actions : {
        enterEdit : function() {
            this.set('editMode', true);
        },
        saveEdit : function() {
            this.set('editMode', false);
            //this properly handles the promise that is returned 
            this.get('model').then(m => m.save());
        }
    }});
    

    【讨论】:

    • 我不知道它是否有效,代码早已不复存在,我继续做出反应:)
    • 是的,我没想到你会。我只是把它留在这里,让其他偶然发现它的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多