2013-05-05 5 views
2

Я пытаюсь использовать наблюдателей для наблюдения за изменениями на моей модели после XHR. Это связано с тем, что более ранний подход расширения fn и вызова super больше не допускается.Наблюдатель не стреляет по созданному объекту

Запуск в этот странный вопрос, где мой наблюдатель не срабатывает:

App = Ember.Application.create({ 
    ready: function() { 
     console.log('Ember Application ready'); 
     this.topCampaignsController = Ember.ArrayController.create({ 
      content: null 
     }); 

     App.TopCampaignsModel.create({ 
      // Calling super is no longer allowed in object instances 
      //success: function() { 
      // this._super(); 
      // App.topCampaignsController.set('content', this.get('data')); 
      //}, 
      onDataChange: function() { 
       console.log('data property on the object changed'); 
       App.topCampaignsController.set('content', this.get('data')); 
      }.observes('data') 
     }); 
    } 
}); 

App.TopCampaignsModel = Ember.Object.extend({ 
    data: null, 

    // this will be actually called from an XHR request 
    success: function() { 
     this.set('data', [5,10]); 
    }, 

    init: function() { 
     console.log('TopCampaignsModel created'); 
     this.success(); 
     console.log(this.get('data')); 
    } 
}); 

Jsfiddle здесь: http://jsfiddle.net/gdXfN/26/

Не знаю, почему консоль не регистрирует «свойство данных об объекте изменился». Откройте альтернативные подходы к тому, как я могу переопределить «успех» fn в моем экземпляре.

+0

Почему вы хотите привязать обработчик успеха к запросу AJAX? Это не идиоматично в ember. Если вы пытаетесь наблюдать за созданием или обновлением модели на сервере, это лучший способ. – buuda

+0

Я не использую данные ember. Все уши приближаются к этому. – Rajat

ответ

5

После того, как в декабре прошлого года после this commit, больше невозможно установить наблюдателей при создании объекта. Это привело к огромной победе в производительности.

Для установки наблюдателей на создание вам нужно использовать:

var Object = Object.createWithMixins({ 
    changed: function() { 
    }.observes('data') 
}); 

Вот fiddle демонстрирует это.

Документация по API должна быть соответствующим образом обновлена, что я буду делать позже.

Однако я не советую вам это делать, а вместо этого установите наблюдателей во время определения объекта. Тот же результат может быть достигнут: http://jsfiddle.net/teddyzeenny/gdXfN/32/

Тем не менее, есть две вещи, которые вы делаете, которые идут против концепций Поста:

  1. Вы не должны создавать экземпляры контроллер самостоятельно, вы должны позволить Ember создать их вы:

    App.TopCampaignsController = Em.Controller.extend({ content: null }); 
    

    Когда приложение инициализировано, Ember будет генерировать контроллер для вас.

  2. Модели не должны знать о наличии контроллера. Контроллеры должны обращаться к моделям не наоборот.

    Модели и контроллеры будут взаимодействовать друг с другом по маршрутам.

За последние два пункта, вы можете посмотреть учебник по http://emberjs.com/guides/, чтобы увидеть, как приложения, контроллеры, модели и маршруты должны взаимодействовать. Поскольку вы не используете Ember Data, просто игнорируйте DS.Model и представьте себе Ember.Object. Учебник может дать вам довольно хороший обзор того, как должны взаимодействовать объекты.

+0

Я не использую функцию маршрутов Ember, так как мой url не меняется. В этом случае я должен сам создать контроллеры. Я согласен с моделью, не зная о точке контроллера, хотя и в основном для иллюстрации. – Rajat

+0

Эмбер-маршрутизатор не является обязательным, это самое главное. Это менеджер состояния приложения и клей между его компонентами, и вы должны использовать его для создания своего приложения ember.Управление URL-адресом в маршрутизаторе - это просто бонус, который вы можете легко отключить: 'App.Router.reopen ({location: 'none'});' Вот скрипка, демонстрирующая, как использовать маршруты без URL-адресов: http: // jsfiddle.net/teddyzeenny/gdXfN/33/, и вот сгенерированное приложение: http://jsfiddle.net/teddyzeenny/gdXfN/33/show/, обратите внимание, как нет изменения URL-адреса. –

+0

Так много изменилось в выпусках RC. Я работал с Ember pre-версиями, и концепция маршрутизатора там не была. Anyhoo, как он узнает, какой шаблон выбрать для маршрута? Я вижу, что вы используете «идентификаторы» вместо имени шаблона данных на своих шаблонах. – Rajat

Смежные вопросы