Esta pergunta é antiga, mas lutei por um longo tempo tentando obter uma resposta para esse problema que funcionasse para minhas necessidades e não a encontrasse facilmente. Acredito que minha solução a seguir é muito melhor do que a atualmente aceita, talvez porque o angular tenha adicionado funcionalidade desde que a pergunta foi feita originalmente.
Resposta curta, usando o método Module.value permite passar dados para um construtor de controlador.
Veja meu desentupidor aqui
Crio um objeto de modelo, associo-o ao controlador do módulo, referenciando-o ao nome 'model'
HTML / JS
<html>
<head>
<script>
var model = {"id": 1, "name":"foo"};
$(document).ready(function(){
var module = angular.module('myApp', []);
module.value('model', model);
module.controller('MyController', ['model', MyController]);
angular.bootstrap(document, ['myApp']);
});
function confirmModelEdited() {
alert("model name: " + model.name + "\nmodel id: " + model.id);
}
</script>
</head>
<body >
<div ng-controller="MyController as controller">
id: {{controller.model.id}} <br>
name: <input ng-model="controller.model.name"/>{{controller.model.name}}
<br><button ng-click="controller.incrementId()">increment ID</button>
<br><button onclick="confirmModelEdited()">confirm model was edited</button>
</div>
</body>
</html>
O construtor no meu controlador aceita um parâmetro com o mesmo identificador 'model' que ele pode acessar.
Controlador
function MyController (model) {
this.model = model;
}
MyController.prototype.incrementId = function() {
this.model.id = this.model.id + 1;
}
Notas:
Estou usando a inicialização manual do bootstrapping , o que me permite inicializar meu modelo antes de enviá-lo para o angular. Isso funciona muito mais bem com o código existente, pois você pode esperar para configurar seus dados relevantes e compilar apenas o subconjunto angular do seu aplicativo sob demanda quando desejar.
No plunker, adicionei um botão para alertar os valores do objeto de modelo que foram inicialmente definidos em javascript e passados para angular, apenas para confirmar que angular está realmente fazendo referência ao objeto de modelo, em vez de copiá-lo e trabalhar com uma cópia.
Nesta linha:
module.controller('MyController', ['model', MyController]);
Estou passando o objeto MyController para a função Module.controller, em vez de declarar como uma função embutida. Eu acho que isso nos permite definir muito mais claramente nosso objeto de controlador, mas a documentação Angular tende a fazê-lo em linha, então achei que precisava de esclarecimentos.
Estou usando a sintaxe "controller as" e atribuindo valores à propriedade "this" do MyController, em vez de usar a variável "$ scope". Acredito que isso funcionaria bem usando $ scope também, a atribuição do controlador seria algo parecido com isto:
module.controller('MyController', ['$scope', 'model', MyController]);
e o construtor do controlador teria uma assinatura como esta:
function MyController ($scope, model) {
Se, por qualquer motivo que você quiser, também poderá anexar esse modelo como valor de um segundo módulo, que será anexado como uma dependência ao seu módulo principal.
Eu acredito que a solução dele é muito melhor do que a atualmente aceita, porque
- O modelo passado para o controlador é na verdade um objeto javascript, não uma sequência que é avaliada. É uma referência verdadeira ao objeto e as alterações nele afetam outras referências a esse objeto de modelo.
- Angular diz que o uso do ng-init pela resposta aceita é um mau uso, o que esta solução não faz.
A maneira como o Angular parece funcionar na maioria dos outros exemplos que eu já vi tem o controlador definindo os dados do modelo, o que nunca fez sentido para mim, não há separação entre o modelo e o controlador, o que realmente não parece MVC para mim. Esta solução permite que você realmente tenha um objeto de modelo completamente separado que você passa para o controlador. Observe também que, se você usar a diretiva ng-include, poderá colocar todo o seu html angular em um arquivo separado, separando completamente a visualização e o modelo do seu modelo em partes modulares separadas.