首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改Emberjs控制器中的对象,以便更新视图?

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

Stack Overflow用户
提问于 2012-09-21 18:19:59
回答 1查看 300关注 0票数 0

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

代码语言:javascript
复制
connectOutlets: function(router) {
    router.get('applicationController').connectOutlet(
       'acquisitions', router.get('acquisitionsController').find());
}

AcquisitionsController看起来如下所示:

代码语言:javascript
复制
(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资源,所以我没有使用model,而是有一个resource,如下所示:

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

这允许与我的CRUD、fetch()ember-resourcesave()方法无缝集成。

最初,duration属性是null,在我的模板中,我是这样做的:

代码语言:javascript
复制
{{#if acquisition.duration}}
  <tr>
    <th>{% trans "Duration" %}</th>
    <td>{{view Ember.TextField valueBinding="acquisition.duration"}}</td>
  </tr>
{{/if}}

然后,我有一个按钮来添加duration属性,如下所示:

代码语言:javascript
复制
{{#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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-22 02:16:28

我被你的addDuration函数弄糊涂了。但是,您似乎需要调用obj.set('duration', 1);而不是obj.duration = 1。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12536039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档