如何修改Emberjs控制器中的对象,以便更新视图?

时间:2012-09-21 18:20:00

标签: ember.js

在我的路由器中,我这样做:

connectOutlets: function(router) {
    router.get('applicationController').connectOutlet(
       'acquisitions', router.get('acquisitionsController').find());
}

AcquisitionsController看起来像这样:

(function(app) {
  'use strict'

  var AcquisitionsController = Ember.Controller.extend({
    all: [],

    find: function() {
      var self = this,
          pk = $('#object-pk').attr('data-value');

      var imageResource = App.Image.create({id: pk});
      imageResource.fetch().done(function(data) {
        _.each(data.acquisition_pks, function(value, index) {
          var acquisitionResource = App.Acquisition.create({id: value});
          acquisitionResource.fetch().done(function(data) {
            self.all.addObject(data);
          });
        });
      });

      return self.all;
    },

    remove: function(acquisition) {
      var self = this;
      var acquisitionResource = App.Acquisition.create(acquisition);
      acquisitionResource.destroy().done(function() {
        self.all.removeObject(acquisition);
      });
    },

    addDuration: function(acquisition) {
      var self = this;
      if(acquisition.duration === null) {
        acquisition.duration = 1;
        var acquisitionResource = App.Acquisition.create(acquisition);
        var obj = self.all.findProperty('id', acquisitionResource.data.id);
        if (obj !== undefined)
          obj.duration = 1;
        acquisitionResource.save();
      }
    }
  });

  app.AcquisitionsController = AcquisitionsController;
  app.acquisitionsController = AcquisitionsController.create();
})(window.App);

find()remove()函数运行正常,我的视图也会更新。

但是,当我从模板中将addDuration作为{{action}}调用时,虽然该函数已执行且对象已保存,但视图未更新。

我认为该视图以某种方式观察我的控制器的all属性,因为我设置的是我的插座的content,它看起来像是当我添加和删除项目时观察到,但是当它内部的项目发生变化时观察到。

我该如何解决问题?

修改

以下是对addDuration应该做什么的一点解释。

我正在使用ember-resource,所以我没有model,而是resource,如下所示:

var Acquisition = Ember.Resource.define({
  url: '/images/api/acquisition',
  schema: {
    id: String,
    date: Date,
    number: Number,
    duration: Number
  }
});

这允许使用fetch()的{​​{1}}和save()方法与我的CRUD API无缝集成。

最初,ember-resource属性为duration,在我的模板中,我这样做:

null

然后我有一个按钮来添加{{#if acquisition.duration}} <tr> <th>{% trans "Duration" %}</th> <td>{{view Ember.TextField valueBinding="acquisition.duration"}}</td> </tr> {{/if}} 属性,如下所示:

duration

因为我正在检查{{#unless acquisition.duration}} <li><a href="#" {{action addDuration acquisition}}>{% trans "Add duration" %}</a></li> {{/unless}} ,所以null阻止在那里,最初{{#if acquisition.duration}} duration不会显示。所以我希望用户点击TextField按钮,这样就可以创建Add duration

理想情况下,该字段是空的,但现在我满足于初始值TextField,只是因为我认为这会更容易。因此,在我的1中,我正在尝试更新当前的action对象,以便将acquisition属性设置为duration

1 个答案:

答案 0 :(得分:1)

我对你的addDuration功能感到有些困惑。但看起来你需要调用obj.set('duration', 1);而不是obj.duration = 1.