【问题标题】:directive link not populating form input with value指令链接不使用值填充表单输入
【发布时间】:2015-06-03 13:34:19
【问题描述】:

我有一个名为 dgFormElement 的指令,它带有一个 link,它动态生成单个表单输入的 html 字符串,然后将该输入编译到元素中:

myApp.directive("dgFormElement", function($compile, $injector) {
    return {
      link: function($scope, $element) {

        var html = '';

        // Dynamically build the form input html string here, then...
        // ...
        // ...

        // Compile element.
        var linkFn = $compile(html);
        var content = linkFn($scope);
        $element.append(content);

      }
    };
});

在应用程序的早期(在另一个指令中,而不是在控制器中),值已被放置在范围内,并且在 链接的 $scope 中可用:

console.log($scope.nid); // 123
console.log($scope.title); // Hello World

这是一些示例 html 输出:

<form id="node_edit" class="ng-pristine ng-valid ng-scope">

  <div dg-form-element="">

    <input type="hidden" name="nid" value="123" ng-model="form_state.values['nid']" ng-init="form_state.values['nid'] = nid" class="ng-pristine ng-untouched ng-valid ng-scope">

  </div>

  <div dg-form-element="">

    <input type="text" name="title" value="Hello World" ng-model="form_state.values['title']" ng-init="form_state.values['title'] = title" class="ng-pristine ng-valid ng-scope ng-touched">

  </div>

  <div dg-form-element="">

    <button data-ng-click="dg_form_submit(form_state);" type="button" >Save</button>

  </div>

</form>

此时有一个问题……页面渲染时,文本输入包含Hello World

将文本字段留空并提交表单,以下值将通过提交处理程序 (dg_form_submit):

{
  values: {
    nid: 123
  }
}

但是,如果我在文本字段中输入一些内容(例如 foo)然后提交表单,则会出现以下值:

{
  values: {
    nid: 123,
    title: 'foo'
  }
}

为什么页面加载时Hello World 字符串没有加载到文本输入中?

如果我从文本输入中删除 ng-modelHello World 文本将正确加载

<input type="text" name="title" value="Hello World" ng-init="form_state.values['title'] = title" class="ng-pristine ng-valid ng-scope ng-touched">

但随后在表单提交过程中,标题值不可用,只有隐藏值可用:

{
  values: {
    nid: 123
  }
}

有趣的是隐藏值总是通过,但不是文本值。

已解决

经过多次尝试和错误,我发现我只需要在隐藏输入上使用 ng-init 指令,而我后来在应用程序中不小心覆盖了 $scope.nid$scope.title

【问题讨论】:

    标签: angularjs drupal


    【解决方案1】:

    这是因为您在输入元素上设置了ng-model。当 Angular 编译 html 时,它将根据 ng-model 的值设置输入值。

    我看到您已经将form_state.values['title'] 的初始值设置为title,但是这个变量title 是在哪里定义的?

    如果你想用硬编码的字符串初始化它,那么你必须用引号指定它​​。

    试试这个。

    <input type="text" name="title" ng-model="form_state.values['title']" ng-init="form_state.values['title'] = 'Hello World'" class="ng-pristine ng-valid ng-scope ng-touched">
    

    演示http://plnkr.co/edit/sHS2qvkY0ctXlB1ge5gn?p=preview

    【讨论】:

    • 澄清一下,title 变量在应用程序的早期设置,并且在link 函数期间可在$scope.title 中使用。但是,如果我注释掉$scope.title 的设置,则不会出现任何差异。硬编码所有输入的值是不可行的,所以我会尝试你的ng-model 建议。我也没有使用任何 ng-controllers,因为 AFAIK 它们将在 Angular 2.x 中被弃用。
    • 我已更新我的问题以描述从文本输入中删除 ng-model
    • 我将 title 变量添加到控制器范围,它也可以正常工作。
    • 这非常接近解决方案。现在,是否可以在没有ng-controller 的情况下做到这一点,即在另一个指令中?我已经更新了我的问题,以反映在 dgFormElement 指令之前运行的另一个指令中将值放入 $scope 的事实。
    • 是的,如果父指令有自己的范围,你可以这样做。否则它将使用父指令父控制器的范围。
    猜你喜欢
    • 1970-01-01
    • 2015-03-30
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多