2015-11-21 63 views
1

我嘗試過所有可以想到的方式來觸發表單的ng模型函數。我正在使用引導日期選擇器。當日期被選中時,我需要引導datepicker來觸發ng-model的值更新,有些人可以告訴我如何使用外部庫或外部事件與ng-model進行交互?與外部腳本中的angularjs模型進行通信

這是我的代碼示例。

這不是很複雜。

/// <reference path="../../typings/tsd.d.ts" /> 
 
var app = angular.module("DatePick", []); 
 
var doc = document; 
 
app.controller("AppCtrl", [ 
 
\t "$scope", "$q", "$http", 
 
\t function($scope, $q, $http){ 
 
\t \t var appCtrl = this; 
 
\t \t 
 
\t \t appCtrl.name = "Jesse App"; 
 
\t \t 
 
\t \t $scope.$on("pickerChange", function(evt, data){ 
 
\t \t \t 
 
\t \t $scope.$apply(function(){ 
 
\t \t \t 
 
\t \t \t $scope.form[data.key] = data.value; 
 
\t \t \t console.log(data); 
 
\t \t }) 
 
\t \t 
 
\t \t \t 
 
\t \t }) 
 
\t } 
 
]); 
 

 
var $scope; 
 
doc.addEventListener("DOMContentLoaded", function(e){ 
 
\t 
 
\t angular.bootstrap(doc.querySelector("html"), ["DatePick"]); 
 
\t 
 
\t var element = document.querySelector("form"); 
 
\t 
 
\t $scope = angular.element(element).scope(); 
 
\t 
 

 
\t 
 
}); 
 

 
$(document).ready(function(){ 
 
\t 
 
\t $("input:text").datepicker().change(function(e){ 
 
\t \t 
 
\t \t $scope.$emit("pickerChange", {key:$(e.currentTarget).attr('name'), value:$(e.currentTarget).val()}) 
 

 
\t }) 
 
\t 
 
\t $(".trigger").click(function(e){ 
 
\t \t 
 
\t \t var input = $("input[type=text]"); 
 
\t \t input.val('xxx'); 
 
\t \t input.trigger('input'); 
 
\t \t 
 
\t }) 
 
\t 
 
})
<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
\t <meta charset="UTF-8"> 
 
\t <title>Document</title> 
 
\t <meta name="viewport" content="initial-scale=1, maximum-scale=1"> 
 
\t <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.min.css"> 
 
\t <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.5.0/css/bootstrap-datepicker.css"> 
 
\t <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
\t <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.5.0/js/bootstrap-datepicker.min.js"></script> 
 
\t <script src="js/app.js"></script> 
 
</head> 
 
<body ng-controller="AppCtrl as app"> 
 
\t <div class="container"> 
 
\t \t <h3>{{app.name}}</h3> 
 
\t \t Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit et, nulla, voluptates adipisci commodi, itaque ipsam earum hic ipsa qui nam. Itaque nulla, aut quod sit dignissimos explicabo laborum, mollitia! 
 
\t </div> 
 
\t <div class="container"> 
 
\t \t <form novalidate name="form"> 
 
\t \t \t <div ng-show="form.date.$dirty"> 
 
\t \t \t \t <div ng-show="form.date.$valid">valid</div> 
 
\t \t \t \t <div ng-show="form.date.$invalid">invalid</div> 
 
\t \t \t </div> 
 
\t \t \t <input type="text" name="date" ng-model="date" class="form-control" ng-pattern="/[\d|\/]{5,}/" required> 
 
\t \t \t <div ng-show="form.date2.$dirty"> 
 
\t \t \t \t <div ng-show="form.date2.$valid">valid</div> 
 
\t \t \t \t <div ng-show="form.date2.$invalid">invalid</div> 
 
\t \t \t </div> 
 
\t \t \t <input type="text" name="date2" ng-model="date2" class="form-control" ng-pattern="/[\d|\/]{5,}/" required> 
 
\t \t </form> 
 
\t \t <div class="btn btn-primary trigger">trigger</div> 
 
\t </div> 
 
</body> 
 
</html>

的原因觸發按鈕是,我是想看看我是否能使用jQuery觸發輸入,並得到角更新模型,但它是必要的。

+0

模型激活得很好。你做錯了什麼是'form.date。$ dirty','form.date。$ valid','form.date。$ invalid'調用。嘗試在HTML中放入'{{date}} {{date2}}',當你選擇一個日期時你會看到它更新。 – jperezov

+0

好吧,這是有道理的,但我怎麼得到日期和date2在窗體上驗證。這就像角度不知道它,即使我使用$ scope。$ apply()來確保它知道值已被更改。 – Jesse

+0

將日期選擇器值添加到工廠或服務以便將更新應用於綁定會更有意義嗎? – Jesse

回答

2

您可以使用ui-bootstrap指令庫中的引導datepicker。 它具有角度集成,您可以使用與ng-model的純角度綁定。

+0

我將使用它作爲最後的手段。我沒有太注意它是自舉日期選擇器。我更關心能否從外部腳本與模型進行通信。它可能真的是jquery本身,甚至是另一個腳本。 – Jesse

+1

Angular構建與指令一起工作。 ui boostrap庫擁有大部分正常的boostrap組件作爲創建無縫集成的指令。 恕我直言,人們正在使用反模式的角度,當試圖把事情這樣掛鉤。我會以角度的方式來做,而不是更容易維護和理解。 –

+0

18個月前我開始廣泛地學習Angular。我建議你聽@BjørnSørensen。在與Angular合作之前,要放棄某些開發模式是非常困難的,然而,在以後的道路上,錯誤的Angular約定會導致很多痛苦。這是自以爲是的,如果你和它爭論,就會讓你滿意。 – jusopi

相關問題