在AngularJS主页的"创建组件"部分中,有以下示例:
controller: function($scope, $element) {
var panes = $scope.panes = [];
$scope.select = function(pane) {
angular.forEach(panes, function(pane) {
pane.selected = false;
});
pane.selected = true;
}
this.addPane = function(pane) {
if (panes.length == 0) $scope.select(pane);
panes.push(pane);
}
}
Run Code Online (Sandbox Code Playgroud)
注意如何select添加方法$scope,但是addPane添加了方法this.如果我将其更改为$scope.addPane,则代码会中断.
文档说实际上存在差异,但没有提到差异是什么:
以前版本的Angular(pre 1.0 RC)允许您
this与该$scope方法互换使用,但现在不再是这种情况了.内的方法上的范围限定this并且$scope是可互换的(角套this到$scope),但是不另外你的控制器构造内部.
如何this和$scope在AngularJS控制器的工作?
创建指令时,可以将代码放入编译器,链接函数或控制器中.
在文档中,他们解释说:
但是,对我而言,目前尚不清楚哪种代码应该去哪里.
例如:我可以在编译中创建函数并将它们附加到链接中的作用域,还是仅将函数附加到控制器中的作用域?
如果每个指令都有自己的控制器,控制器如何在指令之间共享?控制器是真的共享还是只是范围属性?
在编写Angular指令时,可以使用以下任何函数来操作声明指令的元素的DOM行为,内容和外观:
对于应该使用哪种功能似乎存在一些混淆.这个问题包括:
有人可以简单解释一下吗?
文档似乎有点迟钝.我没有得到何时使用一个而不是另一个的本质和全局.两个对比的例子很棒.
我想$compile在函数内部的控制器中使用而不是在指令中使用.可能吗?我正在尝试下面的代码.
$compile('<div ng-attr-tooltip="test">Cancel</div>')(scope)
Run Code Online (Sandbox Code Playgroud)
但这是投掷范围是未定义的错误.我试图传递$scope函数内部,但它无法正常工作.
我正在阅读angularJS的基础知识,了解它是如何手动自举的.我遇到了不同的方法,发现这种方法最合适.
angular.element(document).ready(function(){
angular.bootstrap(document,['myapp'])
})
Run Code Online (Sandbox Code Playgroud)
更进一步,我遇到了另一种将其打破基础的方式.我根据我的理解对代码进行了评论,但有人可以向我解释有关如何在幕后工作的更多细节.
window.onload = function (){
var $rootElement = angular.element(window.document);
var modules = [
'ng', // angular module
'myApp', // custom module
// what are we trying to achieve here?
function($provide){
$provide.value('$rootElement',$rootElement)
}
];
var $injector = angular.injector(modules); // one injector per application
var $compile = $injector.get('$compile'); // Compile Service: it traverses the DOM and look for directives and compile and return linking function. No accecess to scope
var compositeLinkFn = $compile($rootElement); // …Run Code Online (Sandbox Code Playgroud) 我喜欢使用指令制作自定义组件.我检查了很多教程,让我感到困惑,任何人都可以解释指令是如何工作的.我计划制作的组件是
<shout-list></shout-list>
Run Code Online (Sandbox Code Playgroud)
喊名单的模板就是这样的
<div class="shout" ng-repeat="shout in shouts">
<p>{{shout.message}}</p>
<img src="media/images/delete.png" width="32" height="32" ng-click="deleteShout({{$index}},'{{shout._id}}')"/>
</div>
Run Code Online (Sandbox Code Playgroud) 假设我正在使用$ http将变量加载到$ scope中:
$http.get('/teachers/4').success(function(data){
$scope.teacher = data;
});
Run Code Online (Sandbox Code Playgroud)
我的模板使用这些数据:
Teacher: {{teacher.name}}
<students-view students="teacher.students"></students-view>
Run Code Online (Sandbox Code Playgroud)
该指令可以加载BEFORE老师完成加载,但我的指令的代码取决于正在加载的teacher.students数组:
app.directive('studentsView', function(){
return {
scope: { students: '=' },
controller: function($scope){
_.each($scope.students, function(s){
// this is not called if teacher loads after this directive
});
}
};
});
Run Code Online (Sandbox Code Playgroud)
我如何得到我想要的行为?我不想停止使用$ http,如果可能的话,我不想为范围分配承诺.
我最近看到了这个例子.这是我第一次在指令中看到控制器.这是正常的事吗.我认为你应该将这两个保留在不同的区域以便测试:
myModule.directive('myComponent', function(mySharedService) {
return {
restrict: 'E',
controller: function($scope, $attrs, mySharedService) {
$scope.$on('handleBroadcast', function() {
$scope.message = 'Directive: ' + mySharedService.message;
});
},
replace: true,
template: '<input>'
};
})
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写自己的AngularJS指令.我想我理解compile和link功能之间的区别.这段视频很好地清除了它.
但我现在不确定我是否理解控制器在指令中扮演的角色.一个指令可以包括一个controller功能,你可以注入$element,$attrs而这种进入,所以它可以做几乎所有的link周围的功能可以做到,我相信,其他的方式.
所以我有两个问题:
controller功能和link功能之间是否存在重要的技术差异?