Friday, May 17, 2024
 Popular · Latest · Hot · Upcoming
12
rated 0 times [  14] [ 2]  / answers: 1 / hits: 79608  / 11 Years ago, fri, september 20, 2013, 12:00:00

I'm having trouble understanding/using the scopes for an angular UI modal.



While not immediately apparent here, I have the modules and everything set up correctly (as far as I can tell), but these code samples in particular are where I'm finding the bug.



index.html (the important part of it)



<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>


Controller.js (again, the important part)



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 (in its entirety)



<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>


So, my question stands: why is the scope not being double-bound to the UI? and why does this have the customized values, but $scope does not?



I have tried to add ng-controller=AppCreateCtrl to the body div in create.html, but that threw an error: Unknown provider: $modalInstanceProvider <- $modalInstance so no luck there.



At this point, my only option is to pass back an object with this.name and this.groupType instead of using $scope, but that feels wrong.


More From » angularjs

 Answers
8

I got mine to work like this:



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


No form name, no $parent. I'm using AngularUI Bootstrap version 0.12.1.



I was tipped off to this solution by this.


[#75555] Thursday, September 19, 2013, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
robinh

Total Points: 371
Total Questions: 105
Total Answers: 89

Location: Cyprus
Member since Mon, Oct 24, 2022
2 Years ago
;