【问题标题】:Ember View not observing property changesEmber View 没有观察到属性变化
【发布时间】:2013-09-17 02:30:19
【问题描述】:

我是 Ember 新手,我正在尝试使用 Ember 视图来观察控制器中的属性更改。我可以记录视图,但是当属性更改时处理程序不会触发。

我基本上是在尝试学习当用户单击删除记录时从视图中删除项目的 Ember 方法。我还没有找到一个很好的指南。任何建议表示赞赏。

如果我遗漏了什么,请告诉我。提前致谢!

(这是一个继承的代码库;我们还没有准备好升级 Ember。)

Ember v1.0.0-rc.3

路线

this.resource('posts');
App.PostsRoute = App.AuthenticatedRoute.extend({ // extension of Em.Route
  model: function() {
    return App.Post.list(); // returns a list of posts
  },

  events: {
    // renders a modal in the post context
    showDeleteModal: function(model) {
      this.render('modals/_confirmation', {
        into: 'posts',
        outlet: 'modal',
        controller: 'post'
      });

      this.controllerFor('post').set('model', model);
    }
  }
});

控制器

App.PostsController = Em.ObjectController.extend(App.PagedTable, Ember.Evented, {
  // ...
});

App.PostController = Em.ObjectController.extend({
  foo: false,

  del: function() {
    this.set('foo', true);
  }
});

查看

App.PostsView = Em.View.extend();

App.PostView = Em.View.extend({
  didInsertElement: function() {
    console.log('Inserted!');
  },

  test: function() {
    console.log('Observed!');
  }.observes('controller.foo')
});

模板

{{#each data in currentDataBlocks itemController="post" itemViewClass="App.PostView"}}
  <tr>
    <td>Stuff</td>
    <td>Stuff</td>
    <td>Stuff</td>
    <td>Stuff</td>
    <td><button class="icon-trash" {{action showDeleteModal data}}></button></td>
  </tr>
{{/each}}

<!-- ... -->

{{outlet modal}}

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    在我看来,管理视图中的项目列表的最佳方法是创建列表的属性,仅包含需要显示的项目,并在视图中迭代此列表。

    使用您的示例(为简单起见进行了一些更改),我将执行以下操作:

    控制器:

    PostsController = Em.ObjectController.extend(....
        fooDataBlocks: function(){
            return this.get("currentDataBlocks").filter(function(dataBlock){
                return dataBlock.get("foo");
            }
        }.property("currentDataBlocks.@each.foo")
    );
    

    模板:

    {{#each data in fooDataBlocks...}}
       ...
    {{/each}}
    

    根据经验,如果可能,总是更喜欢使用属性而不是观察者。 这样,该值仅在需要时才被缓存和计算,而不是在每次更改时。

    【讨论】:

    • 感谢您花时间提供解决方案。这似乎是处理我正在做的事情的更好方法。我试试这个!
    • 好建议,但并不能真正解释为什么视图上的观察者不起作用。我想知道。
    • @neverfox:创建一个jsbin,我看看。
    • 现代项目请使用arrayComputed方法。
    猜你喜欢
    • 2017-04-08
    • 2016-05-30
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    相关资源
    最近更新 更多