2014-03-21 3 views
39
var theApp = angular.module('theApp', []); 
var app = angular.module('theApp', ['ui.bootstrap']); 
app.controller('MenuSideController', ['$scope','SnazzyService','$modal','$log', function($scope, SnazzyService, $modal, $log) { 
    $scope.user.zoomlvl = '2'; 
}]); 

У меня есть контроллер выше, и он устанавливает $scope, который я могу получить только из значений изнутри.

Но я где-то видел, что используя ниже, я мог бы получить доступ к $scope, но когда я console.log($scope)$scope.user.zoomlvl его не существует.

Я не могу понять, как получить доступ к области MenuSideController $ и обновить ее с помощью переменной valZoom.

var appElement = document.querySelector('[ng-app=theApp]'); 
var $scope = angular.element(appElement).scope(); 
console.log($scope); 
$scope.$apply(function() { 
    $scope.user.zoomlvl = valZoom; 
}); 
+0

Кажется странным, вы хотели бы сделать это, но если вы получите доступ к объему модуля/ap p, он является предком области, созданной для контроллера, поэтому изменения, которые сделаны в области дочернего/потомка, не будут видны из контекста родителя. Вообще говоря, вы должны использовать функции, определенные в области управления контроллером, для изменения области $. – shaunhusain

+0

Если вы пытаетесь интегрироваться с какой-либо сторонней библиотекой (в частности, с любым типом манипуляций с DOM), вам может быть лучше написать директиву, которая обертывает сторонний код, таким образом вы можете писать вещи, которые взаимодействуют с сторонний код в вашей функции ссылок и соответствующим образом обновить область действия. – shaunhusain

+0

@shaunhusain просто надеется использовать область $ с моего контроллера в другой части сайта, где я могу изменить входное значение при изменении его значения. '$ watch' работает только в том случае, когда вводится ввод, но не когда значение обновляется с помощью' $ ('# zoom'). val (valZoom); ' – ngplayground

ответ

70

Не видя разметку, я предполагаю, что сфера MenuSideController ребенок возможности для сферы, вы выбираете.

Хотя можно пройти вниз по дереву, как это (предполагается, что объем мы хотим это первый ребенок):

var appElement = document.querySelector('[ng-app=theApp]'); 
var appScope = angular.element(appElement).scope(); 
var controllerScope = appScope.$$childHead; 
console.log(controllerScope.user); 

Это проще просто выбрать элемент, к которому подключен конкретный контроллер.

Предполагая, что вы используете ng-controller директиву:

<body ng-controller="MenuSideController"></body> 

ли вместо:

var controllerElement = document.querySelector('body'); 
var controllerScope = angular.element(controllerElement).scope(); 
console.log(controllerScope.user); 

Демо:http://plnkr.co/edit/WVNDG9sgYgoWaNlrNCVC?p=preview

angular.element(document).ready(function() { 

    var appElement = document.querySelector('[ng-app=theApp]'); 
    var appScope = angular.element(appElement).scope(); 

    console.log('Traversing from appScope to controllerScope:', appScope.$$childHead.user); 


    var controllerElement = document.querySelector('body'); 
    var controllerScope = angular.element(controllerElement).scope(); 

    console.log('Directly from controllerScope:', controllerScope.user); 


    controllerScope.$apply(function() { 
    controllerScope.user.zoomlvl = '10'; 
    }); 
}); 
+4

Я просто наткнулся на этот ответ от Google, и есть очень важное предостережение от использования этого элемента для доступа к области - [он работает только, когда данные отладки Angular включены!] (Https://docs.angularjs.org/ руководство/продукция # disabling-debug-data) Учитывая, что вы можете получить довольно значительное повышение производительности, отключив данные отладки в производстве, я бы несколько настороженно полагался на этот метод. –

+1

@JoeClay Да, вы правы. Я узнал об этом через некоторое время после того, как я разместил этот ответ, но забыл его обновить. Я отредактирую и добавлю объяснение, когда у меня будет время. Спасибо. – tasseKATT

+0

Спасибо!Я не обвиняю вас в том, что вы не обновили его, было бы разумно ожидать, что люди помнят каждый ответ, который они когда-либо делали. Просто подумал, что я бы поднял голову :) –

Смежные вопросы