Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Изменить значение переменной в scope вне angular (https://javascript.ru/forum/angular/52560-izmenit-znachenie-peremennojj-v-scope-vne-angular.html)

arkada38 24.12.2014 08:53

Изменить значение переменной в scope вне angular
 
Angular приложение начинается с body.
<body ng-app="MyApp" ng-controller="Tabs">

Есть переменная nav.
function Tabs($scope,$anchorScroll) {
	$scope.$parent.nav='1'
}

Возникла необходимость, чтобы в мобильном приложении при нажатии кнопки меню изменялось значение переменной nav. При нажатии кнопки выполняется функция onMenuKeyDown(), но как ей передать scope?
Пробовал следующее, но это не работает.
function onMenuKeyDown(){
	angular.element('body').scope().nav = 0;
}

Tek 24.12.2014 10:32

angular.element('body').scope().nav = 0;
нужно обернуть в
scope.$apply(function () {});

arkada38 24.12.2014 10:42

Цитата:

Сообщение от Tek (Сообщение 348039)
angular.element('body').scope().nav = 0;
нужно обернуть в
scope.$apply(function () {});

А подробнее? Пишет scope не определен.
scope.$apply(function onMenuKeyDown(){

});

zorya 24.12.2014 11:03

Ну по сути так и обращайся
$scope.$parent.nav=0;

arkada38 24.12.2014 11:58

$scope.$parent.nav=0;

Так работает если функция понимает где scope. У меня же функция вызывается из голого JS. Как ей изменить переменную в scope из чистого JS?
Я нашел как прочитать значение переменной. Если в контролере прописать
navka=$scope.$parent.nav

то значение navka видно всем функциям. Но мне нужно изменить значение переменной $scope.$parent.nav. Нашел ID $scope.$parent = 04I.

Tek 24.12.2014 12:34

arkada38,
Если изменить значение вне тела ангуляра то view не измениться, для этого существует методы $apply и $digest поподробнее почитать можно например тут , вам нужно
1) найти скоуп
2) найти в скоупе что вы хотите помнять
3) изменение произвести внутри $apply

Пример:
var scope = angular.element('body').scope();
scope.$apply(function () {
     scope.message = "Timeout called!";
});

arkada38 24.12.2014 15:04

Я создал функцию в контроллере
$scope.menubutton = function() {
		$scope.$apply(function(){
			$scope.$parent.active = 'Настройки';
			console.log($scope.$parent.active);
		});
	};
navka=$scope;

Там же присвоил переменной navka $scope. Затем при нажатии кнопки запускается код
navka.menubutton.apply();

Данная функция успешно выполняется. Имя переменной переписывается. Но на самой странице ничего не меняется. У меня есть вкладки, при нажатии на вкладку $scope.$parent.active присваивается название этой вкладки. Через ng-show показывается нужный блок. При клике на вкладку все работает, а при вызове функции по клику на кнопку изменяется только переменная scope. И $scope.$apply используется. Почему не работает?

Tek 24.12.2014 16:29

http://jsfiddle.net/8pysxvdc/7/.....


Часовой пояс GMT +3, время: 16:25.