Ember — дочерний компонент, обновляющий свойство, исходящее из параметров запроса, через родительский компонент

#javascript #ember.js

#javascript #ember.js

Вопрос:

Я использую Ember 1.13.0 и пытаюсь обновить свойство, исходящее из параметров запроса в дочернем компоненте.

В дочернем компоненте js, когда «время» не определено, я устанавливаю его равным 1200. Если я регистрирую значение «time» (this.get(‘time’)) в дочернем компоненте, после его обновления я вижу, что его значение обновляется. Но он не переходит к действию родительского компонента.

Итак, почему я не могу получить его значение в родительском, если оно обновляется в дочернем?

Компонент верхнего уровня:

 {{parent-component time = model.params.incomingTime}}
  

Родительский компонент:

 <div>hello</hello>
{{child-component time=time}}
  

Родительский компонент JS:

 actions: {
 submit:function(){
  var t = this.get('time')
 }
}
  

Дочерний компонент:

 <div>Time is {{currentTime}}</div>
  

Дочерний компонент JS:

 currentTime: function(){
 if(this.get('time')){
  return time;
 } else {
    this.set('time','1200');
    return '1200'
 }
}.property()
  

Маршрут верхнего уровня:

 var route = Ember.Route.extend({
 queryParams: {
  time: {refreshModel:true, replace: false}
 },
 model: function(params){
  return Ember.RSVP.hash({ params: params})
 },
 setupController: function(controller, model) {
            controller.set('model', model);
        }
})
  

Комментарии:

1. покажите нам перехват модели маршрута?

2. Добавлен хук.

Ответ №1:

Будет incomingTime ли введено свойство, params если ваш код будет работать. иначе произойдет сбой.

 {{parent-component time=model.params.incomingTime}}
  

Update1:
отправка всего model.params может сработать.

Компонент верхнего уровня:

 {{parent-component modelParams=model.params}}
  

Родительский компонент:

 <div>hello</hello>
{{child-component modelParams=modelParams}}
  

Родительский компонент JS:

 actions: {
 submit:function(){
  var t = this.get('modelParams.time')
 }
}
  

Дочерний компонент:

 <div>Time is {{currentTime}}</div>
  

Дочерний компонент JS:

 currentTime: function(){
 if(this.get('modelParams.time')){
  return time;
 } else {
    this.set('modelParams.time','1200');
    return '1200'
 }
}.property()
  

Комментарии:

1. Ну, если есть значение, я просто возвращаю его в дочерний компонент, в противном случае мне нужно только установить время, и именно здесь я не могу получить к нему доступ в родительском компоненте

2. если model.params.incomingTime свойство равно undefined , то ember не может распространить изменения вашего дочернего компонента на родительский компонент. поэтому я рекомендую вам использовать значение по умолчанию для model.params.incomingTime . в противном случае переместите логику defaultValue во внутренний модельный хук или в соответствующий контроллер.

3. или же вы можете отправить его model.params и использовать this.get('model.params.time') для получения свойства, а для установки вы можете сказать this.set('model.params.time','value')

4. Ну, я немного неохотно отправляю все параметры вниз. Зачем это нужно. Вы знаете, я обновил Ember 1.11 до 1.13. И я столкнулся с этой проблемой. Существующий код работал с 1.11, но не с 1.13. Может быть, я думал, вероятно, определить время на родительском уровне и передать его вниз. Но я не уверен, есть ли необходимость передавать целые параметры.

5. Я заставил его работать, объявив новый CP в родительском компоненте и вернув просто «время» из этого. Теперь я передаю этот CP дочернему компоненту, а затем обновляю его с помощью действия в родительском компоненте. Похоже, это работает.

Ответ №2:

Я заставил его работать, объявив новый CP в родительском компоненте и вернув просто «время» из этого. Теперь я передаю этот CP дочернему компоненту, а затем обновляю его с помощью действия в родительском компоненте. Таким образом, кажется, что это работает