Caixa de seleção não está vinculada ao escopo em angularjs

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.