8

以下のjsonフォームを評価しようとすると、エラーが発生します-

eval("{form: 'form' , nameToMatch: 'password1'}")

上記のフォームが有効でないのはなぜですか?

ただし、以下は正常に動作します-

eval("{form: 'form'}")

上記のjsonをディレクティブへのparam入力として文字列として渡そうとしています。

以下はhtmlです-

<input type="password" name="password2" ng-model="user.confirmPassword" placeholder="Confirm Password" match="{form: 'form', nameToMatch: 'password1'}" required="required"/>

ありがとう、ムルタザ

4

5 に答える 5

23

json を括弧で囲みます。

 eval("({form: 'form' , nameToMatch: 'password1'})")

ただし、角張った質問のようには見えません。あなたが何をしようとしているのかわからない:

とにかく、json をディレクティブに渡す方法はたくさんあります。オブジェクトを渡すだけでなく、なぜそれをしたいのかわかりません。

json を渡すには、さまざまな方法があります...

  1. 属性オブジェクトから:

    app.directive('foo', function () {
       return function(scope, element, attrs) {
           var obj = eval('(' + attrs.foo + ')');
       };
    });
    

    どこ

    <div foo="{'test':'wee'}"></div>
    
  2. 分離されたスコープから:

    app.directive('foo', function () {
       return {
         restrict: 'E',
         scope: {
          'jsonIn' : '@'
         },
         link: function(scope, element, attrs) {
           var obj = eval('(' + scope.jsonIn + ')');
         };
       };
    });
    

    どこ

    <foo json-in="{'test':'wee'}"></foo>
    

evalしかし、可能であれば、ネイティブの使用は絶対に避けたほうがよいでしょう。ほとんどすべての場合、これは可能です。一部のデータがある場合は、それをスコープ付きパラメーターのオブジェクトに配置し、分離スコープの双方向プロパティを介して渡すか、名前で渡し、angular $eval を実行します。

編集:オブジェクトを渡す...

分離されたスコープで双方向バインディングを使用できます。

app.directive('foo', function (){
  return {
     restrict: 'E',
     scope: {
        'data' : '='
     },
     link: function(scope, elem, attrs) {
        console.log(scope.data);
     }
  };
});

どこ

<foo data="{ test: 'wee' }"></foo>

この方法の本当に優れた点は、スコープ プロパティを使用している場合、双方向に更新されることです。

app.controller('MainCtrl', function($scope) {
    $scope.bar = { id: 123, name: 'Bob' };
});

どこ

<foo data="bar"></foo>

それが役立つことを願っています。

于 2013-02-04T14:06:39.947 に答える
2

フォームでパスワードを確認しようとしているようです。JSON に頼らずに AngularJS で値を渡す方法はたくさんあります。私がオンラインで見つけた最も有用なリソースは、この Google グループのスレッドからのものです。

1) http://jsfiddle.net/pkozlowski_opensource/GcxuT/23/は、2 番目のフィールドの値を最初のフィールドのモデル値と比較します

2) http://jsfiddle.net/S8TYF/は、2 番目のフィールドの値を最初のフィールドの入力値と比較します。

違いは微妙かもしれませんが、実用的な結果があります。(2) では、最初のフィールドに何かを入力し始めるとすぐに確認の検証が開始されます。(1) を使用すると、確認の検証は、最初のフィールドが有効になった後にのみ開始されます。電子メールの確認の例では、電子メールの検証エラーが整理されるまで確認エラーの表示を開始しないことを意味します (これにより、ユーザーは一度に 1 つのエラーに集中できます)。

ソース: https://groups.google.com/d/msg/angular/R4QeNsNksdY/migbplv8GxIJ

最初のリンクから、ディレクティブは次のように使用されます。

<label>e-mail</label>
<input name="email" type="email" required ng-model="email">  

<label>repeat e-mail</label>
<input name="emailRepeat" type="email" required 
       ng-model="emailRepeat" 
       ui-validate-equals="email">

ディレクティブが最初の入力で定義されui-validate-equalsたモデルを指している場所。email

問題を解決するための追加のアイデアを探したい場合は、これに対する StackOverflow の回答がいくつかあります。

于 2013-02-04T16:23:21.313 に答える
2

も参照してください。@Blesh はパスで言及しましたが、強調していません: Angular は の「安全な」バージョンを提供します。これはeval()、宣言オブジェクト/配列をスコープで宣言したくない場合にディレクティブに渡すのに完全に機能し、賢明にも native を使用したくありませんeval()。OPの例では、ディレクティブ内でこれを使用してください:

angular.$eval(attrs.match);
于 2014-04-05T16:06:53.763 に答える
1

ただし、角張った質問のようには見えません。

同意 - バニラ JS はこれを問題なく処理できます。

// Markup (HTML)
<div mydirective='{"test1": "foo", "test2": "bar"}'></div>

// App (JS)
JSON.parse(attrs['mydirective']);
于 2014-07-16T22:48:18.000 に答える
0

angular で JSON.parse(string) を使用します。パラメータが文字列形式であることを確認してください。

于 2014-10-07T16:03:16.653 に答える