Eu estou tentando vincular uma checkbox de seleção ao escopo usando ng-model. O estado inicial da checkbox de seleção corresponde ao modelo de escopo, mas quando eu marquei / desmarcamos a checkbox de seleção, o modelo não mudou. Algumas coisas a notar é que o modelo é carregado dinamicamente em tempo de execução usando ng-include
app.controller "OrdersController", ($scope, $http, $location, $state, $stateParams, Order) -> $scope.billing_is_shipping = false $scope.bind_billing_to_shipping = -> console.log $scope.billing_is_shipping
Quando eu marquei a checkbox, o console registra false, quando desmarco a checkbox, o console novamente registra false. Eu também tenho um modelo de pedido no escopo, e se eu mudar o modelo da checkbox de seleção para ser order.billing_is_shipping, ele funciona bem
Eu lutei com esse problema por um tempo. O que funcionou foi ligar a input a um object em vez de um primitivo.
Check Me! // Controller $scope.someObject.someProperty = false
Se o modelo for carregado usando ng-include
, você precisará usar $parent
para acessar o modelo definido no escopo pai desde que ng-include
se deseja atualizar clicando na checkbox de seleção.
function Ctrl($scope) { $scope.billing_is_shipping = true; $scope.checked = function(){ console.log($scope.billing_is_shipping); } }
DEMO
Na minha diretiva (na function de link ) eu havia criado o sucesso da variável de escopo assim:
link: function(scope, element, attrs) { "use strict"; scope.success = false;
E no modelo de escopo incluído tag de input como:
Isso não funcionou.
No final, mudei minha variável de escopo para ficar assim:
link: function(scope, element, attrs) { "use strict"; scope.outcome = { success : false };
E minha tag de input para ficar assim:
Agora funciona como esperado. Eu sabia de uma explicação para isso, mas esqueci, talvez alguém o preencha para mim. 🙂
Expandindo a resposta de Matt , por favor, veja este vídeo Egghead.io que aborda este problema e fornece uma explicação para: Por que vincular propriedades diretamente ao $ escopo pode causar problemas
consulte: https://groups.google.com/forum/#!topic/angular/7Nd_me5YrHU
Geralmente isto é devido a outra diretiva entre o seu ng-controller e sua input que está criando um novo escopo. Quando o select gravar seu valor, ele será gravado no escopo mais recente, portanto, ele será gravado nesse escopo em vez do pai que está mais distante.
A melhor prática é nunca ligar diretamente a uma variável no escopo em um
ng-model
, isso também é conhecido como sempre incluindo um “ponto” no seu ngmodel.