我有一个控制器负责与API通信以更新用户的属性,名称,电子邮件等.每个用户都有一个'id'在查看个人资料页面时从服务器传递的用户.
我想将此值传递给AngularJS控制器,以便它知道当前用户的API入口点是什么.我试过传递价值ng-controller.例如:
function UserCtrl(id, $scope, $filter) {
$scope.connection = $resource('api.com/user/' + id)
Run Code Online (Sandbox Code Playgroud)
并在HTML中
<body ng-controller="UserCtrl({% id %})">
Run Code Online (Sandbox Code Playgroud)
其中{% id %}打印从服务器发送的id.但我得到错误.
在创建时将值传递给控制器的正确方法是什么?
我有一个现有的页面,我需要删除一个带有可以动态加载的控制器的角度应用程序.
这是一个片段,它根据API和我发现的一些相关问题实现了我应该如何完成的最佳猜测:
// Make module Foo
angular.module('Foo', []);
// Bootstrap Foo
var injector = angular.bootstrap($('body'), ['Foo']);
// Make controller Ctrl in module Foo
angular.module('Foo').controller('Ctrl', function() { });
// Load an element that uses controller Ctrl
var ctrl = $('<div ng-controller="Ctrl">').appendTo('body');
// compile the new element
injector.invoke(function($compile, $rootScope) {
// the linker here throws the exception
$compile(ctrl)($rootScope);
});
Run Code Online (Sandbox Code Playgroud)
JSFiddle.请注意,这是实际事件链的简化,上面的行之间有各种异步调用和用户输入.
当我尝试运行上面的代码时,$ compile返回的链接器抛出:Argument 'Ctrl' is not a function, got undefined.如果我正确理解了引导程序,它返回的注入器应该知道Foo模块,对吧?
相反,如果我使用一个新的注入器angular.injector(['ng', 'Foo']),它似乎工作,但它创建一个新的$rootScope,不再与Foo模块被引导的元素相同的范围. …
对于这种情况,我有一个带有一些AngularJS指令,控制器等的HTML页面.
像这样的东西:
<html>
<body>
<div ng-controller="myCtrl">
<ul><li ng-repeat="item in items">{{item.name}}</li></ul>
</div>
<div class="placeholder">
...new HTML here...
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
请注意,ng-app页面上没有指令.我不依赖于自动引导,而是使用手动引导方法.
angular.bootstrap(document, ['myApp']);
Run Code Online (Sandbox Code Playgroud)
首先,我创建了将被引导到文档的模块.然后,当加载动态确定的依赖项列表时,我会附加一些服务,控制器等.一切准备就绪后,我调用bootstrap方法.
这一切都很好,直到AngularJS之外的JavaScript附加到该...new HTML here...位置的DOM .AngularJS不处理新的HTML.
我的理解是你需要调用$scope.$apply()或者$digest()什么来让AngularJS识别新的HTML.但是,在我的示例中,没有围绕新HTML的控制器.传入的HTML可能如下所示:
<div ng-controller="myOtherCtrl">
<h2>{{model.title}}</h2>
</div>
Run Code Online (Sandbox Code Playgroud)
换句话说,它依赖于app模块中的不同控制器.
angular.bootstrap再次调用该方法,因为页面已经绑定. $scope.$apply从控制器内部调用,因为重点是控制器代码没有被调用. 我已经阅读了Ifeanyi Isitor延迟加载帖子和Ben Nadel帖子,但他们似乎没有解决在现有控制器的上下文之外加载的HTML.
我不能选择使用AngularJS指令来处理DOM操作.它是体系结构的一个独立部分,它使用ExtJS作为注入新DOM元素的框架.这意味着我不能使用ngInclude作为例子.
看起来我可以打电话angular.module('myApp').$refresh();,.$apply()但这不是一个选择.我错过了什么?