2013-11-21 18 views
6

Tôi có một yêu cầu trong đó tôi nên viết nhà máy. Nhà máy này nên chứa 3 hàm init, lưu và xóaLàm thế nào để nhà máy AngularJS trả lại một đối tượng

Tôi nên gọi hàm init từ bộ điều khiển. Hàm này trả về một đối tượng. Đối tượng này có chức năng thực hiện chức năng thêm và xóa.

làm cách nào tôi có thể đạt được điều này?

Sau đây là mã của tôi, Nó thực hiện hàm init thành công nhưng khi tôi cố gắng sử dụng các đối tượng mà đã để lại vào add hoặc xóa, nó nói đối tượng là trống

angularApp.factory('SomeFactory', function(){ 
var client = new Client(); // this client is defined in another javascript file 
          // this is the object which we should return 
var clientReady = function() { 
    var cv = client.GetVersion(); 
    showIDs(); 
}; 
return { 
    initClient:function(requiredUID){ 
     client.setAttribute("clientReadyCallback",clientReady); 
    }//, 

}; 
var add = function() { 
    client.someapi; 
}; 
var delete = function() { 
    client.someapi; 
};` 
}); 

in controller i call the below calls 
SomeFactory.initClient("username"); 
SomeFactory.add();// throws error 

Làm thế nào tôi có thể đạt được điều này?

+0

Bạn không bao giờ đạt được 'var add = function() ...' bởi vì bạn đang quay trở lại trước nó. – Beterraba

+0

ngay cả khi tôi ass những chức năng bên trong trở lại với dấu phẩy tách ra, nó vẫn không hoạt động – user1834664

+0

Bạn có thể đặt mã của bạn trong một fiddle? – Beterraba

Trả lời

18

Trước hết, bạn không phải trả lại nhà máy, mà là một dịch vụ. Đó là một nhà máy tạo dịch vụ, do đó hãy điều chỉnh quy ước đặt tên của bạn như vậy: app.factory('someService'

Mã của bạn là một mớ hỗn độn và có lỗi, vì vậy tôi sẽ chỉ cho bạn những điều cơ bản về trả lại đối tượng dịch vụ.

app.factory('someService', function() { 
    var someService = { //build this object however you want 
    add: function() { 

    }, 
    save: function() { 

    } 
    }; 

    return someService; //return the object 
}); //end factory 

trong điều khiển của bạn: someService.add();

+0

Cảm ơn bạn rất nhiều. Nó hoạt động tốt ngay bây giờ. – user1834664

+0

Thực ra câu trả lời này hơi lệch. Trả lại một đối tượng trên thực tế là một nhà máy, không phải là một dịch vụ. Trả lại một đối tượng cho phép nhà máy sản xuất một phiên bản mới, tức là nó có thể mới, cho phép bạn tạo nhiều bản sao của dịch vụ từ một nguồn tiêm duy nhất. Xem bài viết này để biết chi tiết: http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/ hoặc câu trả lời của tôi trong câu hỏi này –

+1

Bạn không nói gì khác hơn những gì tôi đã nói . Bạn chỉ cần thêm một chi tiết bổ sung về việc tạo một cá thể mới với 'mới'. Cách tôi nghĩ về nó, điều đó không liên quan đến góc cạnh. Bạn có thể hoạt động trên giá trị được tiêm của dịch vụ, tuy nhiên bạn muốn. Đối với câu trả lời của bạn, 'var instanceOne = new $ factory;' không được đặt tên chính xác. Một nhà máy là một chức năng tạo ra một cái gì đó. '$ factory' trong ví dụ của bạn là cái được tạo bởi nhà máy, một' dịch vụ'. – m59

2

đây là một nhà máy xác thực từ một dự án thực

//factory using firebase Athentication service 
 
myApp.factory('Authentication', function($firebase,$firebaseAuth,$location){ 
 

 
\t var ref = new Firebase("URL_to_firebase"); 
 
    var simpleLogin = $firebaseAuth(ref); 
 

 
    var myObject = { 
 
    \t //user is the data from the FORM 
 
    \t login : function(user){ 
 
    \t \t return simpleLogin.$authWithPassword({ 
 
\t \t \t email: user.email, 
 
\t \t \t password: user.password 
 
\t \t \t }); 
 
    \t }//login 
 
    }//password 
 

 
    return myObject;//factory should return something 
 

 
}); 
 

 
//and then you call like this in your controller 
 
myApp.controller('myController' , function($scope, $location, $firebaseAuth,Authentication){ 
 
\t 
 
\t $scope.login = function() { 
 
\t \t Authentication.login($scope.user) 
 
\t } //login 
 

 
\t 
 
});

1

Một nhà máy và dịch vụ là thực sự khác nhau trong một đơn giản nhưng rất, rất quan trọng.

A Nhà máy trả về các dịch vụ có thể mới.

Nói cách khác, bạn có thể làm điều này:

var instanceOne = new $factory; 
var instanceTwo = new $factory; 

... và sau đó gọi cho họ như những thực thể riêng biệt. Đây là thực tế những gì các mô hình nhà máy là tất cả về.

Dưới đây là một ví dụ đơn giản của một nhà máy mà bạn có thể nhận được bản sao của ...

app.factory('myFactory', function() { 
    return { 
     talk: function(what) { 
      return "Say " + what; 
     } 
    } 
}); 

Nếu thay vào đó bạn muốn có một dịch vụ, bạn cần phải tham khảo các phương pháp bên trong nó bằng cách this.methodName, sau đó bạn chỉ cần trả lại bản thân dịch vụ, hoặc, một mẫu đơn. Giống như vậy ...

app.service('myService', function() { 
    this.talk = function(what) { 
     return "Say " + what; 
    }; 
}); 

Là một lưu ý phụ; nếu bạn nhìn vào mã của tôi, bây giờ Angular hỗ trợ thực sự xác định dịch vụ thông qua từ khóa dịch vụ, hoặc, từ khóa nhà máy. Trong nguồn, bạn có thể thấy rằng cả hai đều tham chiếu theo cùng một mã.

Đó là cách chúng giống nhau, và thực tế hai phương pháp nhà máy và dịch vụ này có thể hoán đổi cho nhau, vì vậy, nếu bạn bị lẫn lộn lúc đầu, đừng đổ mồ hôi; hầu như không có sự khác biệt nào cả ... gần như :)

...rất nhiều người dường như muốn biết: "Làm thế nào bạn có thể trả lại một nhà máy hoặc dịch vụ chỉ có một chức năng, tức là, chính nó, là chức năng?" Dễ dàng ... như thế này ...

app.factory('myFactory', function() { 
    return function(what) { 
      return "Say " + what; 
    } 
}); 
Các vấn đề liên quan