จะอัพเดตขอบเขต var จากนิพจน์ทางคณิตศาสตร์และขอบเขตอื่นได้อย่างไร

ไม่แน่ใจว่าฉันได้อธิบายคำถามของฉันให้ชัดเจนหรือไม่ แต่สิ่งที่ฉันต้องการจริงๆ คืออัปเดต min-width ด้วย ng-style สำหรับ <li> แต่ละรายการภายใน ng-repeat ให้เท่ากับเปอร์เซ็นต์ของ 100 / array.length

วิธีแก้ปัญหาแรกของฉันคือ:

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

ใช้งานได้ แต่ฉันไม่ชอบนิพจน์ทางคณิตศาสตร์ในมุมมอง ฉันอยากให้มีไว้ในตัวควบคุม บางสิ่งบางอย่างในบรรทัดของ:

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

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

ปัญหาของแนวทางนี้คือเมื่อเนื้อหาอาเรย์เปลี่ยนแปลง percentage จะไม่เปลี่ยนแปลง ฉันสามารถเพิ่ม $watchCollection ถึง array และอัปเดต percentage ที่นั่นได้ แต่รู้สึกว่าไม่ถูกต้อง เหมือนว่าฉันขาดแนวทางที่ดีกว่าไป ฉันเหรอ?

ถ้าไม่ คุณชอบโซลูชันใด นิพจน์ทางคณิตศาสตร์ในมุมมอง หรือ $watchCollection?


person rfgamaral    schedule 26.05.2015    source แหล่งที่มา


คำตอบ (3)


คุณควรกำหนดเปอร์เซ็นต์เป็นฟังก์ชัน

ดูที่นี่:

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>

จส:

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);
    }
});
person Christian    schedule 26.05.2015

คุณควรใช้ฟังก์ชันสำหรับตัวอย่าง:

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

และ

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

ดังนั้นในแต่ละ DOM การรีเฟรชความยาวของอาเรย์ของคุณจะถูกรีเฟรชแม้ว่าจะมีการเปลี่ยนแปลงก็ตาม

ความนับถือ,

person CyrilleGuimezanes    schedule 26.05.2015

จะเกิดอะไรขึ้นถ้าคุณใช้ฟังก์ชันแทน:

$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)}">
person jmustonen    schedule 26.05.2015