Estou tentando ver se existe uma maneira simples de acessar o escopo interno de um controlador através de uma função javascript externa (completamente irrelevante para o controlador de destino)
Eu já vi em algumas outras perguntas aqui que
angular.element("#scope").scope();
recuperaria o escopo de um elemento DOM, mas minhas tentativas atualmente não estão produzindo resultados adequados.
Aqui está o jsfiddle: http://jsfiddle.net/sXkjc/5/
Atualmente, estou passando por uma transição do JS simples para o Angular. A principal razão pela qual estou tentando conseguir isso é manter o código da biblioteca original intacto, tanto quanto possível; economizando a necessidade de adicionar cada função ao controlador.
Alguma idéia de como eu poderia conseguir isso? Comentários sobre o violino acima também são bem-vindos.
fonte
.scope()
necessário ativar os Dados de depuração, mas o uso de Dados de depuração na produção não é recomendado por motivos de velocidade. As soluções abaixo parecem girar em torno descope()
Respostas:
Você precisa usar $ scope. $ Apply () se quiser fazer alterações em um valor de escopo fora do controle de angularjs, como um manipulador de eventos jquery / javascript.
Demo: Fiddle
fonte
angular.element("#scope")
não está funcionando, emboraangular.element($("#scope"))
está trabalhando, você precisa ter jquery tambémJá faz um tempo desde que eu postei essa pergunta, mas, considerando os pontos de vista que isso ainda parece ter, aqui está outra solução que encontrei durante esses últimos meses:
O código acima, basicamente cria uma função chamada
safeApply
que calles a$apply
função (como indicado na resposta de Arun) se e somente angular actualmente não está a atravessar o$digest
palco. Por outro lado, se o Angular estiver digerindo atualmente coisas no momento, ele executará a função como está, pois será suficiente para sinalizar ao Angular para fazer as alterações.Inúmeros erros ocorrem ao tentar usar a
$apply
função enquanto AngularJs está atualmente em seu$digest
estágio. OsafeApply
código acima é um invólucro seguro para evitar esses erros.(nota: eu pessoalmente gosto de participar
safeApply
como uma função de$rootScope
para fins de conveniência)Exemplo:
Demonstração: http://jsfiddle.net/sXkjc/227/
fonte
Outra maneira de fazer isso é:
fonte
podemos chamá-lo depois de carregado
http://jsfiddle.net/gentletech/s3qtv/3/
fonte
Já faz muito tempo desde que eu fiz essa pergunta, mas aqui está uma resposta que não requer jquery:
fonte
Aqui está uma solução reutilizável: http://jsfiddle.net/flobar/r28b0gmq/
fonte
Você também pode tentar:
fonte
A resposta aceita é ótima. Eu queria ver o que acontece com o escopo Angular no contexto de
ng-repeat
. O problema é que o Angular criará um sub-escopo para cada item repetido. Ao chamar um método definido no original$scope
, ele mantém seu valor original (devido ao fechamento do javascript). No entanto,this
refere - se ao escopo / objeto de chamada. Isso funciona bem, desde que você tenha certeza de quando$scope
ethis
é o mesmo e quando eles são diferentes. hthAqui está um violino que ilustra a diferença: https://jsfiddle.net/creitzel/oxsxjcyc/
fonte
Eu sou novato, desculpe se é uma má prática. Com base na resposta escolhida, fiz esta função:
Estou usando desta maneira:
A propósito, desculpe pelo meu inglês
fonte
acessando o valor do escopo
suponha que programRow.StationAuxiliaryTime é uma matriz de objetos
fonte
Precisamos usar a função incorporada Js angulares $ aplicar a variáveis de escopo de acesso ou funções fora da função do controlador.
Isso pode ser feito de duas maneiras:
| * | Método 1: usando o ID:
| * | Método 2: Usando o init do ng-controller:
fonte