2015-07-11 125 views
0

我需要一個過濾器,我需要$ http調用,然後返回該響應。我正在嘗試使用角度承諾,但沒有任何工作。回報不等待迴應。看看下面的代碼。它返回{},不等待$ http響應。我只需要使用過濾器。想法是保持它與控制器分開,所以它可以在以後的任何地方使用。

.filter('filterXML',['testOne','$sce',function(testOne, $sce){ 

    return function(url){ 

     return testOne.getTest(url).then(function(data){ 
     return data; 
     }); 

    } 

}]) 


.factory('testOne', ['$http', function($http){ 
    return { 
    getTest: function(url){ 
    return $http.get(url).success(function(data){ 
     console.log(data) 
     return data; 
    }) 
    } 
} 
}]) 

目標:{{'http://rss.cnn.com/rss/cnn_topstories.rss'| filterXML}}

所以它會返回這個rss提要的所有數據。

我不想使用控制器。想法是製作單獨的模塊並在應用程序的任何地方調用它。

任何幫助將不勝感激。 謝謝

+0

你會凍結瀏覽器。你的目標是什麼?你打算如何使用過濾器? – zeroflagL

+0

查看更新的問題。目標是使用過濾器從url字符串獲取xml數據並返回該數據。@zeroflagL –

+0

爲什麼你會使用過濾器? – zeroflagL

回答

1

你不應該在一個過濾器,而不是過濾器是用於http調用。過濾器通常會傳遞一個對象數組,並且只有通過特定條件的對象纔會返回到新過濾的數組中。

我想你想要去一個設立更多這樣的...

angular.module('foo', []) 

.controller('someController', ['$scope', '$filter', 'testOne', function($scope, $filter, testOne){ 

    testOne.getTest('foo/bar').then(function(data){ 
     $scope.myFilteredData = $filter('filterXML')(data); 
    }); 

}]) 


.filter('filterXML', function() { 
    return function(input) { 
    // the condition on which to filter the input goes here... 
    // this is just dummy code you will have to work out your own logic 
    return (input === 'XML'); 
    }; 
}); 


.factory('testOne', ['$http', function($http){ 
    return { 
    getTest: function(url){ 
    return $http.get(url) 
     .success(function(data){ 
     console.log(data) 
     return data; 
     }); 
    } 
} 
}]) 
+0

我知道這一點,但是如果你想只用過濾器做到這一點? –

+0

我不知道。過濾器用於過濾數據,據我所知,這幾乎就是它們的全部。 –

+0

想法是保持它與控制器分開,所以它可以在任何地方使用。任何想法不使用控制器? –

0

使用的服務。事實上,你已經創建了一個:

.factory('testOne', ['$http', function($http){ 
    return { 
    getTest: function(url){ 
    return $http.get(url).success(function(data){ 
     console.log(data) 
     return data; 
    }) 
    } 
} 
}]) 

現在只需注入$ testOne到控制器中,然後在你的控制器做:

var service = $testOne; 
service.getTest('http:/some.url').then(function(response){ /*do something with the response */}); 
+0

請參閱我想讓我的代碼與控制器分開。否則,每次我都必須將這些行放在每個控制器中。所以從過濾器中調用它,然後它可以運行在我們將要調用的地方。 –

+0

閱讀下面的Kasper說。你用過濾器咆哮錯誤的樹。這就像是堅持要駕駛一條船,因爲你不喜歡填滿輪胎。工作錯誤的工具。 – geoidesic

0

我不希望使用的控制器。想法是製作單獨的模塊並在應用程序的任何地方調用它。


看,我想保持我的代碼從控制器分離。否則,每次我都必須將這些行放在每個控制器中。所以從過濾器中調用它,然後它可以運行在我們將要調用的地方。


我建議你把它變成一個服務,然後(能夠使用它任何地方),暴露出要利用到$rootScope說服務的方法*(因爲讓我們面對現實它,filter是不是你在找什麼)。


app.service('someServiceName', function ($http) { 
    function getStuff (url) { 
    return $http.get(url).then(function (res) { 
     return res; 
    }); 
    } 

    angular.extend(this, { 
    getStuff: getStuff 
    }); 
}); 

app.run(function ($rootScope, someServiceName) { 
    $rootScope.getStuff = someServiceName.getStuff; 
}); 

{{ getStuff(url) }} 

*:我通常不建議暴露的東西到$root,但你似乎很死心塌地不使用DI(如果我閱讀完所有的意見/答案/問題(s)正確)到$scopes這將會出現。