即使该属性仅在模板中使用,属性的DS.Model中的观察者也会触发

时间:2014-09-06 05:31:03

标签: ember.js ember-data

我已经编写了一个具有分页功能的数组控制器。

当我第一次切换到其他页面时,没有问题。 但是,如果我修改了之前访问过的页面,则会触发使用属性的观察者模板。 (在这种情况下,published

当我从模板中删除{{#unless published}}...{{/unless}}时,当我再次访问我已经访问过的页面时,观察者不再被触发。

我认为我的控制器上没有做过奇怪的事情......

(点击分页按钮时,它只是更改控制器的page) (我在模型类中为title编写了观察者,以测试此问题是否仅限于published属性,title的观察者也像published的观察者一样。所以此问题似乎不限于published属性)

我正在使用 Ember:1.7.1 + pre.f095a455 Ember数据:1.0.0-beta.9 把手:1.3.0 jQuery:1.11.1 我尝试了测试版和金丝雀版的ember,但这个问题仍然存在。

might_be_bug

这是我的路线

MuteAdmin.IndexRoute = Ember.Route.extend({
  model: function(params, transition, queryParams) {
    var search = params.search || '';
    var page = params.page || 1;


    return this.store.find(this.get('articleModelClassName'), {
      search: search,
      page: page
    });
  },

  setupController: function(controller, model) {
    controller.set('model', model);
    var will_paginate_meta = model.get("meta.will_paginate");

    controller.set('totalPages', will_paginate_meta.total_pages);
    controller.set('previousPage', will_paginate_meta.previous_page);
    controller.set('nextPage', will_paginate_meta.next_page);
  }
});

这是我的控制器

MuteAdmin.IndexController = Ember.ArrayController.extend(MuteAdmin.Modelable, {
  queryParams: ['page', 'search'],
  page: 1,
  totalPages: null,
  pageChanged: function() {
    this.store.find(this.get('articleModelClassName'), {
      search: this.get('search'),
      page: this.get('page')
    }).then(function(model) {
      this.set('model', model);

      var will_paginate_meta = model.get("meta.will_paginate");
      this.set('totalPages', will_paginate_meta.total_pages);
      this.set('previousPage', will_paginate_meta.previous_page);
      this.set('nextPage', will_paginate_meta.next_page);
    }.bind(this));
  }.observes('page'),

  actions: {
    doSearch: function() {
      this.store.find(this.get('articleModelClassName'), {
        search: this.get('search'),
        page: 1
      }).then(function(model) {
        this.set('model', model);

        var will_paginate_meta = model.get("meta.will_paginate");
        this.set('totalPages', will_paginate_meta.total_pages);
        this.set('previousPage', will_paginate_meta.previous_page);
        this.set('nextPage', will_paginate_meta.next_page);
        this.set('page', will_paginate_meta.current_page);
      }.bind(this));
    }
  }
});

这是我的模板

{{#each controller}}
    <tr>
      <td>{{link-to title "edit" this}} {{#unless published}}<small class="text-muted">비공개</small>{{/unless}}</td>
      <td>{{author.name}}</td>
      <td>{{category.title}}</td>
      <td>시간 지정</td>
      <td>{{viewCount}}</td>
    </tr>
  {{/each}}

这是我的模型,有观察员

MuteAdmin.Article = DS.Model.extend({
  title: DS.attr( 'string' ),
  body: DS.attr( 'string' ),
  category: DS.belongsTo('category'),
  author: DS.belongsTo('user'),
  viewCount: DS.attr('number'),
  published: DS.attr('boolean', { defaultValue: true }),
  publishScheduled: DS.attr('boolean', { defaultValue: false }),
  publishScheduleTime: DS.attr('date'),

  publishedChanged: function() {
    if (this.get('published') == true) {
      this.set('publishScheduled', false);
    } 
    console.log('published changed! ' + this.toString());
  }.observes('published'), 
});

1 个答案:

答案 0 :(得分:1)

没关系,我知道它是什么。您为服务器调用已存在的记录。结果将合并到商店中预先存在的记录中,从而导致模型失效并使观察者触发。

http://emberjs.jsbin.com/OxIDiVU/1043/edit