角度用户界面模式的范围问题

我在理解/使用有角度的 UI 模式的范围方面有困难。

虽然这里不是很明显,但是我已经正确地设置了模块和所有东西(据我所知) ,但是这些代码示例是我发现 bug 的地方。

.html (它的重要部分)

<div class="btn-group">
<button class="btn dropdown-toggle btn-mini" data-toggle="dropdown">
Actions
<span class="caret"></span>
</button>
<ul class="dropdown-menu pull-right text-left">
<li><a ng-click="addSimpleGroup()">Add Simple</a></li>
<li><a ng-click="open()">Add Custom</a></li>
<li class="divider"></li>
<li><a ng-click="doBulkDelete()">Remove Selected</a></li>
</ul>
</div>

Js (同样是重要的部分)

MyApp.controller('AppListCtrl', function($scope, $modal){
$scope.name = 'New Name';
$scope.groupType = 'New Type';


$scope.open = function(){
var modalInstance = $modal.open({
templateUrl: 'partials/create.html',
controller: 'AppCreateCtrl'
});
modalInstance.result.then(function(response){


// outputs an object {name: 'Custom Name', groupType: 'Custom Type'}
// despite the user entering customized values
console.log('response', response);


// outputs "New Name", which is fine, makes sense to me.
console.log('name', $scope.name);


});
};
});


MyApp.controller('AppCreateCtrl', function($scope, $modalInstance){
$scope.name = 'Custom Name';
$scope.groupType = 'Custom Type';


$scope.ok = function(){


// outputs 'Custom Name' despite user entering "TEST 1"
console.log('create name', $scope.name);


// outputs 'Custom Type' despite user entering "TEST 2"
console.log('create type', $scope.groupType);


// outputs the $scope for AppCreateCtrl but name and groupType
// still show as "Custom Name" and "Custom Type"
// $scope.$id is "007"
console.log('scope', $scope);


// outputs what looks like the scope, but in this object the
// values for name and groupType are "TEST 1" and "TEST 2" as expected.
// this.$id is set to "009" so this != $scope
console.log('this', this);


// based on what modalInstance.result.then() is saying,
// the values that are in this object are the original $scope ones
// not the ones the user has just entered in the UI. no data binding?
$modalInstance.close({
name: $scope.name,
groupType: $scope.groupType
});
};
});

Create.html (完整的)

<div class="modal-header">
<button type="button" class="close" ng-click="cancel()">x</button>
<h3 id="myModalLabel">Add Template Group</h3>
</div>
<div class="modal-body">
<form>
<fieldset>
<label for="name">Group Name:</label>
<input type="text" name="name" ng-model="name" />
<label for="groupType">Group Type:</label>
<input type="text" name="groupType" ng-model="groupType" />
</fieldset>
</form>
</div>
<div class="modal-footer">
<button class="btn" ng-click="cancel()">Cancel</button>
<button class="btn btn-primary" ng-click="ok()">Add</button>
</div>

因此,我的问题是: 为什么作用域没有被双重绑定到 UI?为什么 this有定制的值,而 $scope没有?

我尝试将 ng-controller="AppCreateCtrl"添加到 create.html 的 body div 中,但是抛出了一个错误: “ Unknown Provider: $modalInstanceProvider <-$modalInstance”,所以没有找到。

此时,我唯一的选择是使用 this.namethis.groupType返回一个对象,而不是使用 $scope,但这感觉不对。

79386 次浏览

当涉及到嵌套作用域时,不要将 <input>直接绑定到作用域的成员:

<input ng-model="name" /> <!-- NO -->

将他们至少绑定到更深的层次:

<input ng-model="form.name" /> <!-- YES -->

原因是作用域通常继承其父作用域。因此,当设置第一级成员时,这些成员直接在子范围中设置,而不影响父级成员。与此相反,当绑定到嵌套字段(form.name)时,成员 form是从父作用域读取的,因此访问 name属性可以访问正确的目标。

阅读更详细的描述 给你

2014年11月更新 :

实际上,在升级到 ui-bootstrap 0.12.0之后,您的代码应该可以正常工作。外包作用域与控制器的作用域合并,因此不再需要 $parentform.的东西。

0.12.0前 :

该模式使用移位来插入其内容。由于 ngForm,您可以控制范围的 name属性。所以,为了逃避被包含的范围,只需要这样修改表单:

<form name="$parent">

或者

<form name="$parent.myFormData">

模型数据将在控制器范围内可用。

我的就是这样工作的:

var modalInstance = $modal.open({
templateUrl: 'partials/create.html',
controller: 'AppCreateCtrl',
scope: $scope // <-- I added this
});

没有表单名,没有 $parent。我正在使用 AngularUI Bootstrap 版本0.12.1。

这个向我透露了这个解决方案。

$scope.open = function () {


var modalInstance = $uibModal.open({
animation: $scope.animationsEnabled,
templateUrl: 'myModalContent.html',
controller: 'salespersonReportController',
//size: size
scope: $scope
});


};

它为我工作范围: $scope 谢谢你 Jason Swett

我添加范围: $scope 然后它工作。酷