2013-05-02 3 views
1

Я пытаюсь использовать функцию «потребности», чтобы один контроллер мог получить значение от другого. Вот JSFiddle, который показывает урезанную версию моего приложения, прежде чем связывать значение: http://jsfiddle.net/kevinwh/WRxnE/4/Emberjs: сбой перекрестного контроллера, потому что «контент» еще не существует

App.ApplicationController = Ember.ObjectController.extend({ 
    init: function() { 
    this._super(); 
    }, 
    dishClicked: function() { 
    console.log('clicked'); 
    this.incrementProperty('clickCount'); 
    } 
}); 

App.DishController = Ember.ObjectController.extend({ 
    needs: ['application'], 
    init: function() { 
    this._super(); 
    }, 
    //clickCountBinding: 'controllers.application.clickCount' 
}); 

В принципе, мой ApplicationController имеет свойство ClickCount, который обновляется (по действию) всякий раз, когда один из посудомоечных ссылок щелкнули , Нажатие на ссылку также активирует DishRoute через linkTo.

Теперь я хочу, чтобы содержащийся DishController также имел доступ к clickCount ApplicationController. Поэтому я добавляю свойство «needs» и свойство clickCountBinding (которое должно быть раскомментировано в JSFiddle). Затем, когда я нажимаю на ссылку, я получаю жалобу: утверждение не выполнено: не удалось делегировать set ('clickCount', 0) в свойство content для объектного прокси: его «контент» не определен.

По-видимому, привязка активируется до того, как содержимое модели установлено на контроллере. Поскольку контроллер настраивается с помощью linkTo, мои методы DishRoute.model() и DishRoute.setupController() не вызываются. Кроме того, метод DishController.init() даже не вызывается до того, как произойдет ошибка привязки.

Я рассмотрел возможность того, что я должен просто вставить объект-член контента в класс (закомментирован в JSFiddle), но при этом получается причудливый результат: количество кликов увеличивается отдельно для разных ссылок. Интересно, но не то, что мне нужно.

Итак - как мне поделиться значением clickCount на этих контроллерах? Есть ли другой способ настроить контент в DishController, чтобы привязка работала?

ответ

5

Вы только немного неправильно поняли сообщение об ошибке.
Проблема заключается в том, что вы подклассифицировали ApplicationController от ObjectController, даже если у него нет базового объекта содержимого для прокси-сервера, в этом случае вы должны просто указать пользователю Ember.Controller. Если у вас есть счетчик, вы, вероятно, должны по умолчанию использовать его в нуле.

App.ApplicationController = Ember.Controller.extend({ 
    clickCount: 0, 
    dishClicked: function() { 
    console.log('clicked'); 
    this.incrementProperty('clickCount'); 
    } 
}); 

App.DishController = Ember.ObjectController.extend({ 
    needs: ['application'], 
    clickCountBinding: 'controllers.application.clickCount' 
}); 
+0

Ну, это делало тривиальный случай работы, хотя я обнаружил, что мне нужно изменить DishController на контроллер, а не на ApplicationController. Тем не менее, мне действительно нужен DishController, чтобы быть ObjectController (возможно, мой JSFiddle был слишком сложен, чтобы это было ясно). Есть ли способ заставить два объекта ObjectControllers работать вместе? Получение содержимого набора контроллеров деталей кажется проблемой. – kevinw

+0

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

+0

Действительно. Установка начального значения для clickCount в DishController ** сделала ** сделать эту работу. Большое спасибо, хотя я должен признать, что этот бит волшебной магии путал меня. Для любого, кто видит это, рабочая версия: http://jsfiddle.net/kevinwh/WRxnE/5/ – kevinw

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