KenSchnetz
KenSchnetz

Reputation: 206

AngularJS Conditional ngStyle not applying

I am trying to make my input width respond to an AngularJS scope variable, by setting it's width conditionally with ng-style. I have gotten this to work beautifully with text-align, but for some reason it is not working with width...

The HTML:

<body ng-app="vfApp">
    <!--This works...  --> <input resize ng-style="{ 'width' : '100%' }" type="text"/>
    <!--This does not?!--> <input resize ng-style="{ 'width' : doResize ? '100%' : '10%' }" type="text"/>
</body>

The JS:

var vfApp = angular.module('vfApp', []);
vfApp.directive('resize', function () {
    return function ($scope) {
        $scope.doResize = false;
    };
});

EDIT: This is different from the suggested possible duplicate because I am not trying to apply a static CSS class, I am trying to use a variable to conditionally apply a style inline.

Upvotes: 1

Views: 583

Answers (2)

kukkuz
kukkuz

Reputation: 42352

I see you are using Angular 1.0.1. You can use this:

ng-style="doResize && {'width':'100%'} || {'width':'10%'}"

See demo below:

var vfApp = angular.module('vfApp', []);
vfApp.directive('resize', function($window) {
  return function($scope) {
    $scope.doResize = true;
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script>

<body ng-app="vfApp">
  <!--This works...-->
  <input resize ng-style="{ 'width' : '100%' }" type="text" />
  <!--This does not?!-->
  <input resize ng-style="doResize && {'width':'100%'} || {'width':'10%'}" type="text" />

  <br/>isMobile value: {{doResize}}

</body>

Upvotes: 1

David Archibald
David Archibald

Reputation: 1518

If you are aiming for the 100% width value, the problem is simple the ternary expression:

doResize ? '100%' : '10%'.

in your js file doResize is false. If you don't understand ternary expressions, they are a condensed if. The uncompressed form of your code is:

if(doResize) {
  return '100%';
} else {
  return '10%';
}

So you have two options to fix it:

  1. Change $scope.doResize = false; to $scope.doResize = true;
  2. Change the ternary expression to doResize ? '10%' : '100%';

Hope that helps.

Upvotes: 0

Related Questions