【问题标题】:how to pass a json as a string param to a directive如何将 json 作为字符串参数传递给指令
【发布时间】:2013-01-19 05:11:40
【问题描述】:

当我尝试评估下面的 json 表单时,它给了我一个错误 -

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

为什么上面的表格无效?

但是下面的工作正常 -

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

我正在尝试将上述 json 作为字符串传递,作为指令的参数输入。

下面是html -

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

谢谢, 穆尔塔萨

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    在你的 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 会好得多。在几乎所有情况下你都可以。如果您有一些数据,只需将其放在作用域参数上的对象中,然后通过隔离作用域上的双向属性或按名称传递它,然后对其执行角度 $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>
    

    希望对你有帮助。

    【讨论】:

    • 感谢您的出色回答。是的,传递一个对象是我想要做的,你能提供任何这样做的链接吗?由于某种原因,我无法使其工作。
    • 上面的代码不起作用,否则我想传递对象,如何使它起作用?
    • 我更新了我的答案,包括关于双向绑定和用于传递实际对象的隔离作用域。
    • angular.fromJson 也可能是比使用eval 更好的方法。
    【解决方案2】:

    您似乎正在尝试在表单中确认密码。有很多方法可以做到这一点,而无需借助 JSON 在 AngularJS 中传递值。我在网上找到的最有用的资源来自这个 Google Group 线程:

    1) http://jsfiddle.net/pkozlowski_opensource/GcxuT/23/ 将比较 第二个字段中的值与第一个字段的 model

    2) http://jsfiddle.net/S8TYF/ 将第二个字段中的值与 输入第一个字段的值

    差异可能很细微,但会产生实际影响: (2) 确认验证将在您开始输入后立即启动 第一个领域的任何东西。使用(1)确认验证将 仅在第一个字段有效后才开始。在电子邮件中确认 例如,这意味着您不会开始显示确认错误,直到 电子邮件验证错误被整理出来(因此用户可以专注于一个 当时的错误)。

    来源:https://groups.google.com/d/msg/angular/R4QeNsNksdY/migbplv8GxIJ

    first link开始,指令使用如下:

    <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 answers,如果您也想查看其他想法来解决您的问题。

    【讨论】:

      【解决方案3】:

      See also。 @Blesh 顺便提到过,但没有强调:Angular 为您提供了一个“安全”的eval() 版本,如果您不想在您的指令中声明它们,它非常适合将声明性对象/数组传递到您的指令中范围,并且明智地不想使用本机eval()。在 OP 的示例中,只需在指令中使用它:

      angular.$eval(attrs.match);
      

      【讨论】:

        【解决方案4】:

        这似乎不是一个有角度的问题。

        同意 - vanilla JS 可以很好地处理这个问题。

        // Markup (HTML)
        <div mydirective='{"test1": "foo", "test2": "bar"}'></div>
        
        // App (JS)
        JSON.parse(attrs['mydirective']);
        

        【讨论】:

          【解决方案5】:

          在角度使用 JSON.parse(string)。确保您的参数是字符串格式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-13
            • 2016-09-08
            • 2023-04-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多