2016-05-06 2 views
2

У меня проблема с моим Угловым сервисом. У меня есть два контроллера и одна служба. В основном первый контроллер получает данные через вызов AJAX и сохраняет эти данные в службе. Второй контроллер затем получает доступ к этим данным через службу. Я успешно передал данные от 1-го контроллера к службе, однако, когда я получаю данные от второго контроллера, он ничего не возвращает.Контроллер не может получить доступ к переменной углового обслуживания

У меня есть один вид с двумя контроллерами, кстати.

Благодаря

служба

app.service('SharedDataService', function() { 
    // Holds subtask that will be passed to other controllers 
    // if SharedDataService is invoke. 
    var _subTask = {}; 
    return { 
    subTask : _subTask 
    }; 
}); 

Контроллер 1

app.controller('MainCategoryController',function($scope,$http,SharedDataService){ 

    $scope.loadSubtask = function(m_uid){ 
     $http({ 
      method: 'POST', 
      url: $locationProvider + 'query_stasks', 
      data: { 
       m_uid: m_uid 
      } 
     }).then(function successCallback(response) { 
       SharedDataService.subTask = response.data; 
      },function errorCallback(response){ 
     }); 

    } 

} 

Контроллер 2

app.controller('SubTaskController',function($scope,$http,$location,$rootScope,SharedDataService){ 



    $scope.$watch('SharedDataService.subTask', function(newValue,oldValue){ 
     console.log("ni sud');"); 
     if (newValue !== oldValue) { 
      $scope.subTasks = newValue; 
     } 
     return SharedDataService.subTask; 
    }); 

}

ответ

1

Поскольку SharedDataService не на $scope, первый аргумент $watch method должен быть watchExpression function вместо Angular expression string.

app.controller('SubTaskController',function($scope,$http,$location,$rootScope,SharedDataService){ 

    $scope.$watch(
     function watchExpression() {return SharedDataService.subTask}, 
     function listener (newValue,oldValue){ 
      console.log("ni sud"); 
      if (newValue !== oldValue) { 
       $scope.subTasks = newValue; 
      } 
     }  
    }); 

}); 

Для получения дополнительной информации см. AngularJS $rootScope.scope API Reference - $watch.

+0

Понял !! это сработало .. Я никогда не использовал "watchExpression" – drake24

0

вы должны написать метод для хранения данных в службе и возвращать данные из службы

app.factory('SharedDataService', function() { 
    // Holds subtask that will be passed to other controllers 
    // if SharedDataService is invoke. 
    var _subTask = []; 
    function setSubTask = function(data){ 
    _subTask = data; 
    }; 
    return { 
    subTask : _subTask, 
    setSubTask:setSubTask 
    }; 
}); 

и вызова контроллера

SharedDataService.setSubTask(response.data); 

установить данные ...

0

попробовать его

app.service('SharedDataService', function() { 
    this._subTask ={}; 
}); 

// keep code same 1st controller 
app.controller('MainCategoryController',function($scope,$http,SharedDataService){ 

$scope.loadSubtask = function(m_uid){ 
    $http({ 
     method: 'POST', 
     url: $locationProvider + 'query_stasks', 
     data: { 
      m_uid: m_uid 
     } 
    }).then(function successCallback(response) { 
      SharedDataService._subTask = response.data; 
     },function errorCallback(response){ 
    }); 

    } 

    } 

// 2nd controller 

    app.controller('SubTaskController',function($scope,$http,$location,$rootScope,SharedDataService){ 

console.log(SharedDataService._subTask); 
}); 
1

Возможно, вы должны сохранить объект использования значения в s ervice. В моем проекте я всегда делаю это так:

app.service('SharedDataService', function() { 
    var service = {}; 
    service._subTask = ''; 
    service.toogle_sub_task = function(v){ 
    if(v){ 
     service._subTask = v; 
    } 
    return service._subTask; 
    } 
    return service; 
}); 

Затем в вашем контроллере. Вы должны вызвать service.toogle_sub_task для установки и получения значения. Просто дайте ему попробовать. Наилучшие пожелания.

0

Лучшая практика заключается в том, чтобы делать любые вызовы $ http/resource в сервисах, а не непосредственно в контроллере или директивах. Это делает код более модульным и менее взаимосвязан.

Вы должны в идеале иметь

app.factory('SharedDataService', function ($http) { 
     var subtasks = []; 
     var saveSubtasks = function(sub){ 
      subtasks = sub; 
      console.log(subtasks) 
     } 
     var tasks = { 
      loadSubtasks : function(m_uid){ 
      $http({ 
         method: 'POST', 
         url: $locationProvider + 'query_stasks', 
         data: { 
          m_uid: m_uid 
         } 
       }).then(function(data){ 
        saveSubtasks(data); 
       }); 
      }, 
      getSubtasks : function(){ 
      return subtasks; 
      } 
      } 
     return tasks; 
    }); 

и использовать его как

app.controller('SharedDataService',function($scope,SharedDataService){ 
    $scope.load = function(val){ 
    SharedDataService.loadSubtasks(val); 
    } 
}); 

app.controller('SubTaskController',function($scope,SharedDataService){ 
    $scope.get = function(){ 
    $scope.subtasks = SharedDataService.getSubtasks(); 
    console.log($scope.subtasks); 

    } 
}); 
Смежные вопросы