如何从Math表达式和另一个范围var更新范围var?

时间:2015-05-26 12:20:18

标签: angularjs angularjs-scope angularjs-watch

我不确定自己是否明确了解自己的问题,但我真正想要的是在min-width内为每个ng-style更新<li> ng-repeat以等于100 / array.length的百分比。

我的第一个解决方案就是:

<li ng-style="{'min-width': (100 / array.length) + '%'}">

这样可行,但我不喜欢视图中的Math表达式,我宁愿在控制器中使用它。有些东西:

$scope.percentage = (100 / $scope.array.length) + '%'

<li ng-style="{'min-width': percentage}"

这种方法的问题是当数组内容发生变化时,percentage不会改变。我可以在$watchCollection添加array并在那里更新percentage,但感觉不对,就像我错过了更好的方法一样。我呢?

如果没有,您更喜欢哪种解决方案?视图中的数学表达式,或$watchCollection

3 个答案:

答案 0 :(得分:1)

你应该使用一个函数作为例子:

$scope.getTableWidth = function(){
   return (100 / $scope.array.length) + '%';
}

<li ng-style="{'min-width': getTableWidth()}">

因此,在每个DOM refesh中,即使数组更改,也会刷新数组长度。

此致

答案 1 :(得分:1)

如果您改用函数怎么办:

$scope.percentage = function () {
  return (100 / $scope.array.length) + '%';
}

// or give array as parameter

$scope.percentage = function (array) {
  return (100 / array.length) + '%';
}

然后使用它:

<li ng-style="{'min-width': percentage()}">

Or

<li ng-style="{'min-width': percentage(array)}">

另一种方法是使用过滤器:

// here it's presumed that you have 
//     var app = angular.module(...);
// somewhere above
app.filter('widthPercentage', function () {
    return function (items) {
        return 100 / items.length + '%';
    };
});

使用它

<li ng-style="{'min-width': (array | widthPercentage)}">

答案 2 :(得分:1)

您应该将百分比定义为函数。

见这里:

http://jsfiddle.net/waxolunist/5bnhj4vt/6/

<强> HTML:

<div ng-app="app">
    <div ng-controller="AController">
        <ul>
            <li class="red" ng-repeat="item in items" ng-style="{'width': percentage()}">{{item}}</li>
        </ul>

    <button ng-click="addItem()">addItem</button>
    </div>


</div>

<强> JS

var app = angular.module('app', []);

app.controller('AController', function($scope) {

    $scope.items = [1,2,3,4,5,6];

    $scope.percentage = function() {
        return 100/$scope.items.length + '%';
    }

    $scope.addItem = function() {
        $scope.items.push($scope.items.length + 1);
    }
});