Передать var в функцию успеха angular $resource

Я схожу с ума по этому поводу, и я думаю, что ответ, вероятно, есть, но я не знаю, как правильно задать вопрос Google.

По сути, мне нужен способ сделать вызов $resource и передать некоторые данные, которые я хочу затем использовать в функции успеха.

app.controller('VariantListController', ['djResource', function(djResource){
    var Variants = djResource('/ship-builder/variants/?format=json');
    var Vehicle = djResource('/ship-builder/vehicles/:id', {id: '@id'});
    this.variants = Variants.query(function(variants){
        $(variants).each(function(){
            console.log(this);
            variantData = this;
            var vehicleData = Vehicle.get({id:this.baseVehicle}, function(){
                console.log(variantData);
            })
        })
    });

}]);

В приведенном выше примере в самой внутренней функции успеха «variantData» всегда является значением ПОСЛЕДНЕЙ записи с предыдущего уровня. Это имеет смысл, потому что значение было установлено последним элементом в массиве задолго до того, как произойдет успех. Мне нужен способ, чтобы иметь значение «variantData», которое не существовало, когда вызывался Vehicle.get().

Имеет ли это смысл? Мне очень трудно объяснить проблему.


person jwvanderbeck    schedule 04.06.2014    source источник


Ответы (3)


Вам нужно создать замыкание, чтобы заставить его работать. Что-то вроде

this.variants = Variants.query(function(variants){
        $(variants).each(function(){
            getVehicleData(this);
        })
    });

function getVehicalData(variantData) {
   var vehicleData = Vehicle.get({id:variantData.vehicleId}, function(){
                console.log(variantData);
            })
}
person Chandermani    schedule 04.06.2014
comment
Вы знаете, это имеет смысл. Позвольте мне попробовать. - person jwvanderbeck; 04.06.2014
comment
Это сработало как шарм, и в ретроспективе также имеет смысл. Спасибо за отличный ответ и за то, что помогли мне узнать немного больше. Я новичок в Javascript, и я думаю, что увлекся тем, насколько он вложен, зайдя дальше, чем должен был!. - person jwvanderbeck; 04.06.2014

Я ни в коем случае не эксперт по сервису $resource, но, возможно, сработает метод $promise.then вместо обратного вызова.

$(variants).each(function(){
  console.log(this);
  variantData = this;

  Vehicle.get({id:this.baseVehicle}).$promise.then(function() {
    console.log(variantData);
  });
});
person Joe    schedule 04.06.2014
comment
Я пробовал играть с $promise, но не смог заставить его работать. Я всегда получаю сообщение об ошибке, говорящее, что $promise не определено. - person jwvanderbeck; 04.06.2014
comment
Ну, вы используете djResource, а не $resource, поэтому, возможно, есть проблема в том, как вы оборачиваете $resource с djResource, что приводит к тому, что $promise не определено. - person Joe; 04.06.2014
comment
Я предполагаю, что это, возможно, ошибка в службе, хотя у нее должен быть идентичный API. - person jwvanderbeck; 04.06.2014

Поскольку значение в variantData может измениться до фактического вызова обратного вызова, необходимо убедиться, что в обратном вызове сохранено исходное значение.

var vehicleData = Vehicle.get({id:this.baseVehicle}, function(vData){
     return function() {
          console.log(vData);
     }
}(variantData));

Вышеприведенное создаст новую функцию с variantData, хранящимися в замыкании.

person Jonathan Fingland    schedule 04.06.2014