这个问题很老,但是我努力了很长时间才能找到一个可以满足我的需求并且不容易找到它的答案。我相信我的后续解决方案要比当前接受的解决方案好得多,这也许是因为自从这个问题最初提出以来,角度就增加了功能。
简短的答案,使用Module.value方法允许您将数据传递到控制器构造函数中。
在这里看到我的朋克
我创建一个模型对象,然后将其与模块的控制器相关联,并使用“模型”名称进行引用
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>
然后,控制器中的构造函数将接受具有相同标识符“模型”的参数,然后可以对其进行访问。
控制者
function MyController (model) {
this.model = model;
}
MyController.prototype.incrementId = function() {
this.model.id = this.model.id + 1;
}
笔记:
我正在使用引导程序的手动初始化,这使我可以在将模型发送到angular之前对其进行初始化。这可以与现有代码配合使用,因为您可以等待设置相关数据,并且仅在需要时才按需编译应用的角度子集。
在插件中,我添加了一个按钮来警告最初在javascript中定义并传递给angular的模型对象的值,只是为了确认angular确实在引用模型对象,而不是复制它并使用副本。
在这行上:
module.controller('MyController', ['model', MyController]);
我将MyController对象传递给Module.controller函数,而不是声明为内联函数。我认为这可以使我们更加清楚地定义控制器对象,但是Angular文档倾向于内联进行,因此我认为需要澄清。
我正在使用“ controller as”语法,并将值分配给MyController的“ this”属性,而不是使用“ $ scope”变量。我相信使用$ scope也可以正常工作,然后控制器分配将如下所示:
module.controller('MyController', ['$scope', 'model', MyController]);
并且控制器构造函数将具有如下签名:
function MyController ($scope, model) {
如果出于任何原因,也可以将此模型附加为第二个模块的值,然后将其作为依赖项附加到主模块。
我相信他的解决方案比目前接受的解决方案好得多,因为
- 传递给控制器的模型实际上是一个javascript对象,而不是要评估的字符串。它是对对象的真实引用,对其所做的更改会影响对此模型对象的其他引用。
- Angular表示,接受的答案使用ng-init是一种误用,此解决方案无法解决。
在我所见过的大多数其他示例中,Angular的工作方式似乎都是由控制器定义模型数据,这对我来说从来没有道理,模型与控制器之间没有分离,这看起来似乎并不像我的MVC。该解决方案使您可以真正拥有一个完全独立的模型对象,并将其传递给控制器。还要注意的是,如果使用ng-include指令,则可以将所有angular html放在单独的文件中,从而将模型视图和控制器完全分成单独的模块。