2016-10-25 66 views
1

这似乎是一个非常简单的问题,但是,无论出于何种原因,我的submit()方法未在JS中调用。Javascript提交不起作用

HTML:

<ion-view title="Register" hide-nav-bar="true" nav-transition="none" id="page9"> 
    <ion-content padding="true" class="manual-ios-statusbar-padding" scroll="false"> 
     <form id="register-form4" ng-submit="register()" class="list"> 
      <ion-list id="register-list4"> 
       <label class="item item-input" id="register-input7"> 
        <input type="text" ng-model="registration.email" placeholder="Email" required> 
       </label> 
       <label class="item item-input" id="register-input9"> 
        <input type="password" ng-model="registration.password" placeholder="Password" required> 
       </label> 
      </ion-list> 
     </form> 
     <a id="register-button7" ng-click="document.getElementById('register-form4').submit();" class="button button-positive button-block">Create Account</a> 
     <a ui-sref="login" id="register-button8" class="button button-positive button-block button-clear">Back</a> 
     <div ng-show="isError">{{ loginError }}</div> 
    </ion-content> 
</ion-view> 

控制器:

.controller('registerCtrl', ['$scope', '$stateParams', "$firebaseAuth", "$location", 
function ($scope, $stateParams, $firebaseAuth, $location) { 
    $scope.register = function() { 
    var email = $scope.registration.email, 
     password = $scope.registration.password, 
     confirmPassword = $scope.registration.confirmPassword; 

     console.log("Being submitted"); 
    } 
}]) 

我不能改变,即使它会更容易的<a>标签只是为了有一个表单提交input但HTML是汽车 - 由Ionic Creator生成,我不能搞砸了。

编辑:我想提交表单,通过这种方式,而不只是触发register()按钮的点击的原因是我想要触发HTML形式required的,这样检查领域得到了输入,所以我不必手动去做

编辑2:我已将<a>标记更改为提交按钮。然而,这仍然无法调用register()方法,建议的形式没有被提交:

<input type="submit" value="Create Account" id="register-button7" class="button button-positive button-block"> 

这些docs来看,它应该工作,因为它几乎是相同的格式

我已阅读,1用户标准的HTML submitng-submit不能一起工作。任何人都知道这是真的吗?

+0

尝试使用“onclick”而不是“ng-click”。 –

+1

你为什么不直接将'ngClick'设置为'ng-click =“register()”'?在这种情况下,我没有看到任何理由需要找到提交表单的表单元素。上面的代码不起作用,因为没有定义'$ scope.document'。另外,我会争辩说,你当前使用的'document.getElementById()'不是“角度的方式”。 TM – c1moore

+0

@ c1moore我原来是这么认为的。其背后的想法是,如果我提交表单,它将触发HTML'required',所以我不必手动检查它们。 – wmash

回答

0

您可以在表单中使用submit类型的html inputbutton。这里是一个的jsfiddle工作演示:https://jsfiddle.net/ydbhb5dL/

控制器:

angular 
    .module('App', []) 
    .controller('ExampleController', function ($scope) { 
     $scope.registration = {}; 

     $scope.register = function() { 
      var email = $scope.registration.email, 
       password = $scope.registration.password; 

      console.log('Email:', email); 
      console.log('Password:', password); 
      console.log('Being submitted!'); 
     }; 
    }); 

HTML:

<div ng-app="App" ng-controller="ExampleController"> 
<ion-view title="Register" hide-nav-bar="true" nav-transition="none" id="page9"> 
    <ion-content padding="true" class="manual-ios-statusbar-padding" scroll="false"> 
    <form id="register-form4" ng-submit="register()" class="list"> 
     <ion-list id="register-list4"> 
     <label class="item item-input" id="register-input7"> 
      <input type="text" ng-model="registration.email" placeholder="Email" required> 
     </label> 
     <label class="item item-input" id="register-input9"> 
      <input type="password" ng-model="registration.password" placeholder="Password" required> 
     </label> 
     </ion-list> 

     <input type="submit" class="button-like-link" value="Create Account (button)"> 
    </form> 
    </ion-content> 
</ion-view> 
</div> 
+0

我试图运行代码片段,但似乎没有工作 – wmash

+0

@wmash你试过我的新更新吗? –

+0

不回复的道歉。是的,我有,它的作品!无论如何,当需要字段时提示默认的HTML警报? – wmash

-1

解决您的问题改变<a>元素将表单提交

<a id="register-button7" ng-click="register()" class="button button-positive button-block">Create Account</a> 

原因ngClick不工作因为它正在查看$scopedocument,这是未定义的。您可能会将以下行添加到您的控制器,但它不是必需的。

$scope.document = document; 

如果你坚持在不改变结构形式,您可以为您提交“按钮”一个类似于以下(另)一个新的指令。

angular.module('moduleName').directive('submitForm', function() { 
    return { 
     restrict: 'A', 
     scope:  { 
      formId: '=' 
     }, 
     link:  function($scope, $elem) { 
      $elem.on('click', function() { 
       document.getElementById($scope.formId).submit(); 
      }); 
     } 
    }; 
}); 

,你会再为使用如下:

<a id="register-button7" submit-form form-id="register-form4" class="button button-positive button-block">Create Account</a> 

如果你还不想改变<a>标签使用新的指令,你唯一的选择是定义$scope.document = document

或者,如@J Orbe提到的,您可以使用onclick而不是依赖Angular指令(即ngClicksubmitForm)。但我不确定这是否符合“Angular way”TM的标准,并且您可能希望避免混合使用Angular和常规JavaScript属性,因为这可能会导致混淆。通常,如果您使用的是Angular,则应该尝试使用Angular解决问题。

+0

你为什么低调回答这个问题?这回答了OP的原始问题,提供了良好的实践解决方案,并解释了为什么它不起作用。 – c1moore

+0

你正在使用AngularJS反模式,那不是你应该如何解决和解释它。 –

+0

@StefanNegele究竟是什么反模式?我见过这个建议很多其他地方。您不想在控制器中混合使用HTML逻辑,因为它会产生不可测试的代码(因此,您不应将'document'放置在$ scope中并尝试搜索元素)。相反,你应该使用一个指令来区分逻辑 – c1moore