2015-06-03 23 views
10

Tôi đang cố gắng tìm ra lý do tại sao chức năng hết thời gian chờ lỗi, do đó hạn chế thay đổi về giá trị mô hình.Loại JS AngularError: f không phải là chức năng

angularExample.html

<!DOCTYPE html> 
<html ng-app="Tutorial"> 
    <head> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> 
    <script type="text/javascript" src="scripts/app.js"></script> 
    </head> 
<body ng-controller="MyController"> 
    <input type="text" ng-model="data" /> 
</body> 
</html> 

app.js

(function() { 

    var app = angular.module('Tutorial', []); 
app.controller("MyController",function($scope,$timeout){ 

    $scope.data="hi"; 
    $timeout(callAtTimeout,3000); 

    var callAtTimeout=function(){$scope.data="hello";} 
}); 
})(); 

Lỗi Snapshot: enter image description here

Trả lời

10

Trước tiên, bạn cần xác định callAtTimeout trước tiên sử dụng.

var callAtTimeout=function(){console.log("hi")} 
$timeout(callAtTimeout,3000); 

khởi tạo trong Javascript không hoisted.

-1

Bạn cần xác định callAtTimeout rồi sử dụng.

1

Xác định các chức năng như var callAtTimeout = function() { ... } xảy ra tại thời gian chạy, không phải lúc biên dịch (trong khi các hàm xác định như function callAtTimeout() { ... } là lúc biên dịch).

Bởi vì điều này, callAtTimeout chưa được xác định trên dòng:

$timeout(callAtTimeout,3000); 

Hoặc di chuyển tờ khai của callAtTimeout trên đường đó, hoặc thay đổi nó để function callAtTimeout() { ... }

+1

Hàm này được định nghĩa là hàm ẩn danh nhưng không được gán cho biến 'callAtTimeout' cho đến khi bạn đến dòng' var callAtTimeout = function() {...} '. Nếu bạn định nghĩa một hàm được đặt tên, nó sẽ có sẵn trên dòng đầu tiên trong phạm vi ('function myName() {...}'). – andlrc

+0

Tương tự với các biến: 'var a = b + 1; var b = 0; 'Cả hai biến' a' và 'b' được định nghĩa ở đầu phạm vi nhưng khi' a' được gán 'b' vẫn chưa được xác định, và' a' do đó sẽ đánh giá thành 'a = undefined + 1' sẽ dẫn đến 'NaN' – andlrc

+0

@ dev-null cảm ơn vì đã làm rõ – Tom

2

Bạn chỉ cần sắp xếp lại thứ tự mã của bạn, định nghĩa cho hàm callAtTimeout phải trước khi bạn sử dụng nó. Ví dụ làm việc:

(function() { 
 

 
    var app = angular.module('Tutorial', []); 
 
app.controller("MyController",function($scope,$timeout){ 
 

 
    var callAtTimeout=function(){$scope.data="hello";} 
 
    
 
    $scope.data="hi"; 
 
    $timeout(callAtTimeout,3000); 
 

 
    
 
}); 
 
})();
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<body ng-app="Tutorial" ng-controller="MyController"> 
 
    <input type="text" ng-model="data" /> 
 
</body>

2

Bạn đang định chức năng callAtTimeout sau khi nó gọi của nó. Bạn cần phải có nó ở trên nó.

Working fiddle

Mẫu mã:

(function() { 

    var app = angular.module('Tutorial', []); 
    app.controller("MyController", function ($scope, $timeout) { 

     var callAtTimeout = function() { 
      $scope.data = "hello"; 
     } 
     $scope.data = "hi"; 
     $timeout(callAtTimeout, 3000); 


}); })(); 
1

Các lỗi cũng có thể xảy ra khi hai hay nhiều phụ thuộc là đặt không đúng chỗ. Tôi biết câu trả lời là kinda off topic nhưng đọc này có thể giúp một ai đó.

(function() { 
'use strict'; 

angular 
    .module('app') 
    .controller('myController', myController); 

myController.$inject = ['dependency1','dependency2','dependency3']; 
/* @ngInject */ 
function myController(dependency1,dependency3,dependency2){ 

    var v = dependency2.somefunction(arg1,arg2,...);//will trigger the error because dependency 2 && 3 are misplaced. 
    //sometimes it can be difficult to see at the first look especially when you have many dependencies 
} 
})(); 
Các vấn đề liên quan