2013-08-19 78 views
3

這是一個非常新手的問題,但爲什麼不爲什麼輸入字段不更新角度模型?

document.getElementById("demo").value 

更新的角度模式?它會更新輸入字段,但只有在手動將某些內容放入字段後纔會更新模型。

下面的代碼:

<div ng-controller="AddCtrl"> 
    <input type="text" id="demo" ng-model="test.fld" ng-change="change()"></input> 
    <br /> 

    [ <a href="" onclick="somefnc()">pop</a> ] 
    [ <a href="" ng-click="add(test)">add</a> ]  
    <p>Test-field: {{test.fld}}</p> 
</div> 



<script> 
    function somefnc() { 
    document.getElementById("demo").value = "hi"; 
    } 
</script> 
+0

你得到這個工作?我嘗試了下面的想法,但它仍然沒有更新。 – techdog

回答

4

答案純粹與角度綁定數據的方式有關。最簡單的答案是,手動更改表單數據後,必須爲元素的作用域調用$ scope。$ apply()。在「角天下」外叫你可以改變somefnc到:

function somefnc() { 
    document.getElementById("demo").value = "hi"; 
    $('#demo').scope().$apply(); 
} 

最佳實踐說,任何直接的DOM操作應該發生只在指令。理想情況下,你會改變在控制器此值的東西,如:

$scope.somefnc = function(){ 
    test.fld = "hi"; 
} 

通過任何角度範圍做這樣不需要$範圍$申請,只有直接DOM操作一樣。

完整的例子是在這裏

<div ng-controller="AddCtrl"> 
    <input type="text" id="demo" ng-model="test.fld" ng-change="change()"></input> 
    <br /> 

    [ <a href="" ng-click="somefnc()">pop</a> ] 
    [ <a href="" ng-click="add(test)">add</a> ]  
    <p>Test-field: {{test.fld}}</p> 
</div> 



<script> 
angular.module('app').controller('AddCtrl',['$scope',function($scope){ 
    $scope/test = {fld: ''}; 
    $scope.add = function(){ 
     $scope.test.fld += test.fld 
    } 
    $scope.change = function(){ 
     alert('I changed!'); 
    } 
    $scope.somefnc = function() { 
     $scope.test.fld = "hi"; 
    } 
}]) 
</script> 
+0

我正在嘗試在更改具有驗證的網站上的輸入值之後觸發驗證。適用範圍不會觸發驗證。有什麼我可以用來觸發在這裏的HTML的情況下驗證: techdog

0

因爲AngularJS只能看着在AngularJS的範圍模式改變。所以你需要修改使用Angular的方式,而不是像jQuery的其他方式,如果你想雙向數據綁定神奇的工作。