2016-11-29 15 views
0

私のサービスで関数を呼びたいと思います。問題は、有効な日付を選択した後、日付を返さなければならないことです。約束を正しく返すことができません

私は間違った方法で戻ると思うので、約束は決して呼ばれません。私の問題を解決するのに手伝ってくれますか?

これは誤りである:私は選択を返す必要が

TypeError: Cannot read property 'then' of undefined at AgendaController.abrirAgenda

agenda.controller.js

function abrirAgenda() { 
     var fechaLimite = new Date(vm.agendaComplejo.anioHoy, vm.agendaComplejo.mesHoy - 1, vm.agendaComplejo.diaHoy); 
     fechaLimite.setDate(fechaLimite.getDate() + 30); 
     var fechaSeleccionada = new Date(vm.agendaComplejo.anioSeleccionado, vm.agendaComplejo.mesSeleccionado - 1, vm.agendaComplejo.diaSeleccionado); 
     agendaService.abrirAgenda(fechaSeleccionada, fechaLimite) 
      .then(prueba); 
    } 

//prueba 
    function prueba(resultado){ 
     debugger; 
    } 

agenda.service.js

// abrir la agenda para cambiar de día/mes 
    function abrirAgenda(fechaSeleccionada, fechaLimite) { 
     debugger; 
     var ipObj1 = { 
      callback: function (val) { //Mandatory 
       var fecha = new Date(val); 
       var dia = fecha.getDate(); 
       var mes = fecha.getMonth() + 1; //Se suma 1 porque el primer mez comienza en 0 
       var anio = fecha.getFullYear(); 
       var fechaDeseada = anio + "-" + mes + "-" + dia; 
       return fechaDeseada; 
      }, 
      inputDate: fechaSeleccionada, 
      //inputDate: new Date(), 
      titleLabel: 'Seleccione una fecha', 
      setLabel: 'Aceptar', 
      todayLabel: 'Hoy', 
      closeLabel: 'Cancelar', 
      mondayFirst: true, 
      from: new Date(2016, 2, 1), 
      to: fechaLimite, 
      weeksList: ["D", "L", "M", "MIE", "J", "V", "S"], 
      monthsList: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"], 
      templateType: 'popup', 
      showTodayButton: false, 
      dateFormat: 'dd MMMM yyyy', 
      closeOnSelect: false 
     }; 
     ionicDatePicker.openDatePicker(ipObj1); 
    } 

日付:"fechaDeseada"ionic datepickerを使用しようとしています。

ありがとうございます!

+1

'abrirAgenda'は何も返しませんので、' undefined'を返します。エラーです。コードには何の約束も全くありません。 'ionicDatePicker.openDatePicker'関数はPromiseを返しますか? –

+0

オフトピックですが、英語でのみコーディングすることをお勧めします – diegoaguilar

答えて

0

フレームワークが約束を使用していますか?その例はそれを示していません。

agenda.controller.js

function abrirAgenda() { 
    //... 

    agendaService.abrirAgenda(fechaSeleccionada, fechaLimite, function(val){ 
      var fecha = new Date(val); 
      var dia = fecha.getDate(); 
      var mes = fecha.getMonth() + 1; //Se suma 1 porque el primer mez comienza en 0 
      var anio = fecha.getFullYear(); 
      var fechaDeseada = anio + "-" + mes + "-" + dia;    
      prueba(fechaDeseada) 
    }) 
} 

agenda.service.js

function abrirAgenda(fechaSeleccionada, fechaLimite, callback) { 
    debugger; 
    var ipObj1 = { 
     callback: callback, 
     //... 
    }; 
    ionicDatePicker.openDatePicker(ipObj1); 
} 
+0

優れた答えです。私が間違えました。約束はない。私はコールバックを使用する必要があります。ありがとう! –

+0

@FederickJonsコールバックを使用する必要はありません。あなたは約束を使用すべきです。 'openDatePicker'が約束したままの約束をサポートしていない場合は、いつでも[promisify](http://stackoverflow.com/q/22519784/1048572)することができます。 – Bergi

-1

私はこのように、代わりにコールバックオブジェクトを使用して試してみましたを@charlietflの提案として編集しましたが、accがありますあなたののagenda.controller.jsに、agendaService.abrirAgendaが約束を返す場合は、以下のコードのようなreturn文を追加する必要があります。 agendaService.abrirAgendaは約束を返さない場合、あなたはあなたにagendaService.abrirAgenda

agenda.controller.js

function abrirAgenda() { 
    var fechaLimite = new Date(vm.agendaComplejo.anioHoy, vm.agendaComplejo.mesHoy - 1, vm.agendaComplejo.diaHoy); 
    fechaLimite.setDate(fechaLimite.getDate() + 30); 
    var fechaSeleccionada = new Date(vm.agendaComplejo.anioSeleccionado, vm.agendaComplejo.mesSeleccionado - 1, vm.agendaComplejo.diaSeleccionado); 
    //RETURN here! 
    return agendaService.abrirAgenda(fechaSeleccionada, fechaLimite); 
} 

agenda.service.js

function abrirAgenda(fechaSeleccionada, fechaLimite) { 
     debugger; 
     var ipObj1 = { 
     //... 
     }; 
     return ionicDatePicker.openDatePicker(ipObj1); //if your framwork doesn't return a promise you will get the same error! 
    } 
+1

'return'は実際にはコントローラのメソッドではなく、サービスのメソッドに入ります! – Hylianpuffball

+0

はい、実際には、サービスのメソッドにも戻り値がなければなりません。そうでなければ結果は返されません。しかし、彼が** agenda.controller.js **の 'abrirAgenda'関数を約束として使用しようとしているなら、彼は州のように' abrirAgenda'メソッドの中に 'return'を置く必要があります文字列で質問の引用符で "TypeError:プロパティ 'を読み取れません'、 '未定義のAgendaController.abrirAgenda" – lealceldeiro

+0

サービスは戻り値が必要です。このエラーは現在、 'agendaService.abrirAgenda()。then()'を使用しようとするとスローされます。 – charlietfl

0

からの約束を得ることはありません約束を返さないAPIから約束を返す場合は、AngularJS $q Service

app.service("agendaService", function($q) { 
    this.abrirAgenda = abrirAgenda; 

    function abrirAgenda(fechaSeleccionada, fechaLimite) { 
     //debugger; 
     var qFuture = $q.defer(); 
     var ipObj1 = { 
      callback: function (val) { //Mandatory 
       var fechaDeseada = anio + "-" + mes + "-" + dia; 
       //... 
       //return fechaDeseada; 
       qFuture.resolve(fechaDeseada); 
      }, 
      //... 
     }; 
     ionicDatePicker.openDatePicker(ipObj1); 
     return qFuture.promise; 
    } 
}); 

上記の例では、Ionic openDatePickerメソッドがコールバックを呼び出すと、$q.deferによって作成された約束が解決されます。

は、使用するには:

agendaService.abrirAgenda(fechaSeleccionada, fechaLimite) 
    .then(prueba); 

//prueba 
function prueba(resultado){ 
    debugger; 
}; 

注:これが唯一の約束を返さないのAPIに適用されます。$http,$timeout,ngResource,などのサービスAngularFireなどはすでにお約束しています。そのような場合には、$q.deferと約束する必要はありません。派生した約束は簡単にChaining Promisesによって作成することができます。

関連する問題