2014-09-24 130 views
0

我是日本學生。所以我的英語不容易閱讀。對不起。AngularJS將變量綁定到與變量相關的數組

我使用AngularJS製作了素數列表。用戶輸入兩個值,valFromvalTo。該列表由兩個數字構成。

我想將輸入值綁定到列表。當我輸入輸入時,列表會動態改變值。但事實並非如此。當我輸入輸入時,列表不會改變。我想將這些值綁定到列表中。

以下是我所做的。值不會被排序,因爲使用了Object而不是Array。

這是index.html。

<!doctype html> 
<html lang="ja" ng-app="MYAPP"> 
<head> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-rc.2/angular.min.js"> </script> 
    <script src="script.js"></script> 
</head> 

<body> 
    <div ng-controller="inputCtrl"> 
     <h1>Make prime number list from {{fromVal}} to {{toVal}}</h2> 
     <input type="number" ng-model="fromVal"><br> 
     <input type="number" ng-model="toVal"><br> 

     <!-- prime numbers list --> 
     <div ng-controller="primeListCtrl"> 
      <div ng-repeat="(val, flag) in primeFlags"> 
       {{val}}</td><td>{{flag==true? "is prime": "isn't prime"}} 
      </div> 
     </div> 
    </div> 

</body> 

的script.js

angular.module('MYAPP', []). 

controller('inputCtrl', function($scope){ 
    $scope.fromVal = 10; 
    $scope.toVal = 50; 
}). 

controller('primeListCtrl', function($scope){ 
    /* 
     If primeFlags[i + ""] is true, i is prime number. 
     Keys are string, values are boolean. 
    */ 
    $scope.primeFlags = {}; 

    // fill with true 
    for(var i = 2; i <= $scope.toVal; i++){ 
     $scope.primeFlags[i+""] = true; 
    } 
    // set false 
    for(var i = 2; i <= $scope.toVal; i++){ 
     for(var j = 2; j < i; j++){ 
      if(i%j === 0){ 
       $scope.primeFlags[i+""] = false; 
       break; 
      } 
     } 
    } 
}); 

我想,爲什麼輸入值不綁定到列表中的原因是primeFlags不會改變。當輸入值更改時,primeFlags未更改。所以,列表不會更新。

我在想兩個解決方案。首先,使用$ scope來觀察輸入值。$ watch()。其次,使用$ broadcast()和$ on()來觀察輸入值。當值改變時,重拍primeFlags。但是,我認爲解決方案並不好。有更好的解決方案嗎?

回答

0

您的素數列表是否完全動態?如果是這樣,你可以在一個函數來創建您的首要列表,然後使用您的轉發該函數的結果:

$scope.primeFlags = function(){ 
     var primeList = {}; 
     // fill with true 
     for(var i = 2; i <= $scope.toVal; i++){ 
      primeList[i+""] = true; 
     } 
     // set false 
     for(var i = 2; i <= $scope.toVal; i++){ 
      for(var j = 2; j < i; j++){ 
       if(i%j === 0){ 
        primeList[i+""] = false; 
        break; 
       } 
      } 
     } 

     return primeList; 
    }; 

,並在HTML:

<div ng-repeat="(val, flag) in primeFlags()"> 

如果你可以建立某種邊界,我想這是更有效的創建提前素數的列表,然後在你的函數只是顯示列表的子集:

app.controller('primeListCtrl', function($scope){ 
    /* 
     If primeFlags[i + ""] is true, i is prime number. 
     Keys are string, values are boolean. 
    */ 
    var primeList = []; 
    // fill with true 
    for(var i = 0; i <= 1000; i++){ 
     primeList[i] = {id: i, flag: true}; 
    } 
    // set false 
    for(var i = 0; i <= 1000; i++){ 
     for(var j = 2; j < i; j++){ 
      if(i%j === 0){ 
       primeList[i].flag = false; 
       break; 
      } 
     } 
    } 

    $scope.primeFlags = function(){ 
     return primeList.slice($scope.fromVal, $scope.toVal); 

    }; 
}); 

和HTML

<div ng-repeat="val in primeFlags()"> 
       {{val.id}}&mdash;{{val.flag==true? "is prime": "isn't prime"}} 
      </div> 
+0

>>您的素數列表是否完全動態?不,謝謝你,我有新的想法。我知道$ scope中的一些函數被調用,如果有什麼更改的話。 – redstone 2014-09-24 11:16:11