2015-09-04 18 views
9

Làm việc trên ứng dụng Ionic hoạt động cả trong Android và Windows.Dịch vụ góc với giá trị mặc định cho các thuộc tính không tồn tại

Có dịch vụ, chẳng hạn như Ionic của $ionicLoading, mà chúng tôi ghi đè lên chức năng để hoạt động đúng trong cửa sổ:

angular.factory('$ionicLoading', function(){ 
    return { 
     show: function(){...} // custom implementation 
     hide: function(){...} // custom implementation 
    } 
}); 

Nhưng cũng có những dịch vụ khác mà chúng ta phải ghi đè lên chỉ để không phá vỡ các ứng dụng. Trong trường hợp này nó sẽ thực sự hữu ích để cung cấp một dịch vụ mà sẽ không làm bất cứ điều gì. Ví dụ:

angular.factory('$ionicExampleService', function(){ 
    return { 
     *foo*: angular.noop // for operations 
     *bar*: promise // returns promise 
    } 
}); 

Lưu ý: Tôi biết rằng một cách tốt hơn để làm điều này sẽ là một dịch vụ cho phép lựa chọn giữa thực hiện Ionic hay một thực hiện một, nhưng điều này chỉ là vì lợi ích của học tập.

Lý tưởng sẽ tiến xa hơn nữa, thật tuyệt vời để có thể trả lại thứ gì đó chống đạn hơn nữa. Dịch vụ linh hoạt như sau:

angular.factory('$ionicPopup', function(){ 
    return /*magic*/; 
}); 

$ionicPopup.show({...}) // show was not defined 
    .then(foo); // won't break and will execute foo() 

Có thể?

+6

Câu hỏi này có câu trả lời rất hay ở đây: http://stackoverflow.com/questions/6600868/set-default-value-of-javascript-object-attributes – sunny

+0

Tôi mở rộng một chút về câu trả lời của Sunny để giúp nó phù hợp với tình hình. Tôi cũng đã xóa xếp hạng -1 của bạn. -C§ – CSS

Trả lời

-3

sử dụng var a = {}; để khai báo biến mới.

0

Sử dụng một đánh giá cho mỗi bài tập dựa trên một tài sản đối tượng, tương tự như sau:

myVar = myObj.myPropVar === undefined ? "default replacement" : myObj.myPropVar; 

Về cơ bản bạn đang sử dụng một tấm séc trị nếu tài sản đã được xác định, thay thế một giá trị mặc định nếu nó hasn' t, và gán nó nếu nó có. Ngoài ra, bạn có thể sử dụng phiên bản sửa đổi của hàm toàn cục trong liên kết của Sunny để xác định mặc định cho tất cả các thuộc tính mà bạn có thể giả định là không xác định tại các điểm cụ thể trong mã của bạn.

function getProperty(o, prop) { 
    if (o[prop] !== undefined) return o[prop]; 
    else if(prop == "foo") return "default value for foo"; 
    else if(prop == "bar") return "default value for bar"; 
    /* etc */ 
    else return "default for missing prop"; 
} 

Hy vọng rằng sẽ giúp,

4

Từ những gì tôi hiểu bạn cần phải ghi đè thực hiện các dịch vụ hiện có. Bạn có thể làm điều đó với một trang trí dịch vụ góc cạnh.

Trình trang trí dịch vụ chặn việc tạo dịch vụ, cho phép nó ghi đè hoặc sửa đổi hành vi của dịch vụ. Đối tượng được trả về bởi trình trang trí có thể là dịch vụ gốc hoặc một đối tượng dịch vụ mới thay thế hoặc kết thúc và ủy quyền cho dịch vụ gốc.

Để biết thêm thông tin, bạn có thể kiểm tra góc documentation. Một ví dụ đơn giản sẽ là:

app.factory('someService', function() { 
    return { 
     method1: function() { return '1'; } 
     method2: function() { return '2'; } 
    }; 
}); 

app.decorator('someService', function ($delegate) { 
    // NOTE: $delegate is the original service 

    // override method2 
    $delegate.method2 = function() { return '^2'; }; 

    // add new method 
    $delegate.method3 = function() { return '3'; }; 

    return $delegate; 
}); 

// usage 
app.controller('SomeController', function(someService) { 
    console.log(someService.method1()); 
    console.log(someService.method2()); 
    console.log(someService.method3()); 
}); 

EDIT: Câu hỏi - Làm thế nào để ghi đè lên mỗi phương pháp trong các dịch vụ?

var dummyMethod = angular.noop; 

for(var prop in $delegate) { 
    if (angular.isFunction($delegate[prop])) { 
     $delegate[prop] = dummyMethod; 
    } 
} 

Tôi hy vọng điều này sẽ giúp ích cho bạn.

+0

Vấn đề là tôi muốn ghi đè lên mọi phương thức mà 'someService' không biết thực hiện của mình. Một cái gì đó như '$ delate.everyMethod = function() {return 'hello world!'; }; ' – fuxes

Các vấn đề liên quan