在Material Design mdDialog documentation中,我注意到他们已经将范围(没有带前缀的美元符号)传递到底部附近的DialogController
。
(function(angular, undefined){
"use strict";
angular
.module('demoApp', ['ngMaterial'])
.controller('AppCtrl', AppController);
function AppController($scope, $mdDialog) {
var alert;
$scope.showAlert = showAlert;
$scope.showDialog = showDialog;
$scope.items = [1, 2, 3];
// Internal method
function showAlert() {
alert = $mdDialog.alert({
title: 'Attention',
content: 'This is an example of how easy dialogs can be!',
ok: 'Close'
});
$mdDialog
.show( alert )
.finally(function() {
alert = undefined;
});
}
function showDialog($event) {
var parentEl = angular.element(document.body);
$mdDialog.show({
parent: parentEl,
targetEvent: $event,
template:
'<md-dialog aria-label="List dialog">' +
' <md-dialog-content>'+
' <md-list>'+
' <md-list-item ng-repeat="item in items">'+
' <p>Number {{item}}</p>' +
' '+
' </md-list-item></md-list>'+
' </md-dialog-content>' +
' <div class="md-actions">' +
' <md-button ng-click="closeDialog()" class="md-primary">' +
' Close Dialog' +
' </md-button>' +
' </div>' +
'</md-dialog>',
locals: {
items: $scope.items
},
controller: DialogController
});
function DialogController(scope, $mdDialog, items) {
scope.items = items;
scope.closeDialog = function() {
$mdDialog.hide();
}
}
}
})(angular);
我已经读过$
是一个命名约定,是确保变量不会被覆盖的好方法。为什么这段代码没有遵循该约定?在这种情况下,我们如何知道何时使用$
,有什么意义?我相信在这种情况下,它必须不仅仅是命名约定,或者作者会选择使用$scope
来保持一致性。
注意:我知道链接函数中$scope
和scope
之间的区别,其中scope
指向一组固定的参数。我不相信这就是scope
在这种情况下使用的原因,但如果我错了,请随时告诉我。
谢谢!
答案 0 :(得分:5)
我认为这里的文档不一致 - 同时也是正确的。
此处的scope
和$scope
将是相同的,但我在阅读完源代码后才知道这一点。罪魁祸首行在InterimElement
内,其中locals
由options
扩展,后者又有scope
属性。
return showDone = compilePromise.then(function(compileData) {
angular.extend(compileData.locals, self.options);
element = compileData.link(options.scope);
我非常确定将$scope
作为scope
访问只是出于事件而保持清洁,应该使用$scope
来引用{{1}提供的值就像在控制器中一样。
我已提交a pull request来修复不一致问题并编译a pen demonstrating the usage。
答案 1 :(得分:0)
这不是常规的失败,甚至连你使用模式的片段都失败了。
使用scope
而不是$scope
,以避免在嵌套函数中覆盖变量。
选择将scope
放置在没有dolar标志的情况下,以避免出现错误,从而获得该代码段。
例如,使用Controller as
语法分隔内容可以帮助您解决问题。