在ember中,如何获取对该控制器中的模型的引用以进行保存

时间:2013-12-15 04:10:33

标签: ember.js

我正在评估Emberjs的背景是我们是否可以将一些代码移植到它但是保持相同的api所以我的第一天真的看着它。

我正在使用Tom Dale教程但没有使用ember-data。我想我已经找到了如何将数据导入应用程序(thx @ kingping2k)。我只需要保存/更新。

我有一个doneEditing动作,当我点击控制台看到它时会调用它,但是如何获得对模型的引用。查看控制器文档(http://emberjs.com/api/classes/Ember.Controller.html),我没有看到像model之类的真正明显的属性。我怎么告诉PostController保存它回到路线的帖子?此外,人们通常在保存完成之后使用jQuery承诺做其他事情(我假设是)?

我已经在底部找到了相关代码和doneEditing操作,我正在寻求帮助:

thx任何帮助

Model:
Hex.Post = Ember.Object.extend({
    id: null,
    body: null,
    isEnabled: null,
    createdAt: null,
    save: function(data){
      console.log("you want to save this item");
      $.post( "api/post", data, function( data ) {
         // something here
    });
    }
});

View:
<script type="text/x-handlebars" id="post">
  {{#if isEditing}}
  {{partial 'post/edit'}}
  <button {{action 'doneEditing'}}>Done</button>
  {{else}}
  <button {{action 'edit'}}>Edit</button>
  {{/if}}

  <h1>{{id}}</h1>
  {{outlet}}
</script>

Route:
Hex.PostRoute = Ember.Route.extend({
    model: function(params) {
        console.log('called with: ' + params.post_id);
       return Hex.Post.findById(params.post_id);
    }
});


Controller:
Hex.PostController = Ember.ObjectController.extend({
    isEditing: false,

   actions:{
    edit: function() {
        this.set('isEditing', true);
    },

    doneEditing: function() {
        this.set('isEditing', false);
        console.log("this gets called");
        //this.get('content').save();
        //this.save();
        //console.log("here: " + this.model.id);
        //this.model.save(); //doesn't work ???
        // this.post.save(); //doesn't work ???
        //this.get('store').commit(); // prob no
    }
   }
});

1 个答案:

答案 0 :(得分:2)

当你从模型钩子返回一个模型时,它会被传递给路径中的setupControllersetupController的默认实现执行此操作controller.set('model', model)

setupController:function(controller, model){
    controller.set('model', model');
}

因此,要在控制器的上下文中获取模型,只需获取该属性。

var model = this.get('model')

我会回复承诺,然后你可以触发保存/失败等事情

save: function(){
  console.log("you want to save this item");
  return Ember.$.post( "api/post", JSON.stringify(this));
}

doneEditing: function() {
    this.set('isEditing', false);
    var model = this.get('model');
    model.save().then(function(){alert('saved');},
                      function(){alert('failure');});
}

通常你会把保存放在重新开放

Hex.Post.reopen({
  save: function(){
    console.log("you want to save this item");
    return Ember.$.post( "api/post", JSON.stringify(this));
  }
});