angularjs从工厂返回数组

时间:2015-11-01 21:17:37

标签: javascript arrays angularjs factory

我试图重构我的角度应用。因此,我介绍了一个包含工厂服务的service.js文件。代码是这样的:

#include <boost/property_tree/json_parser.hpp>
#include <fstream>
#include <iostream>
#include <map>

namespace {
    using Element = std::map<std::string, int>;
    struct Array : std::vector<Element> { };

    Array read(std::string fname) {
        std::ifstream ifs(fname);
        Array into;

        using namespace boost::property_tree;
        ptree pt;
        read_json(ifs, pt);

        for (auto& entry : pt.get_child("values")) {
            Element e;
            for (auto& property : entry.second)
                e[property.first] = property.second.get_value(0);
            into.push_back(std::move(e));
        }

        return into;
    }
}

int main() {
    try {
        auto array = read("input.json");
        std::cout << "Parsed " << array.size() << " elements:\n";

        for (auto& e : array) {
            std::cout << "--------------------\n{ ";
            for (auto& kv : e)
                std::cout << "\"" << kv.first << "\": " << kv.second << ", ";
            std::cout << " }\n";
        }
    } catch (...) {
        std::cout << "Parsing failed\n";
    }
}

在控制器中我称之为:

app.factory('Categorien', function() {
var Categorien = {
    populate: function () {
        var _categorien = [];
        var bedragok = (function bedragOk(categorie) {
            return categorie.bedragAf > 0;
        });

        var categorienFilter = $scope.categorien.filter(bedragok);
        categorienFilter.forEach(function(item) {
            var dataArray = [];
            dataArray.push(item.omschrijving);
            dataArray.push(item.bedragAf);
            _categorien.push(dataArray);
        });
        return _categorien;
    }
};
return Categorien;
});

因此dataTable需要一个函数populate应返回的数组。

我做错了所以我希望你可以帮助我。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您只想进行过滤,我认为您可以使用自定义过滤器。然后你的代码看起来就像下面的演示一样。

如果您想使用工厂,可以将数组传递给您的填充函数$scope.dataTable = Categorien.populate(['your', 'array', 'here']);,或者您可以使用其他方法将数据添加到工厂。正如评论中所提到的,$scope不应传递给工厂。

以下演示(或此fiddle)展示了如何使用自定义过滤器:

&#13;
&#13;
angular.module('demoApp', [])
	.controller('MainController', MainController)
    .filter('categoryFilter', function() {
        return function(input) {
            var _categorien = [];
            var bedragok = (function bedragOk(categorie) {
                return categorie.bedragAf > 0;
            });

            var categorienFilter = input.filter(bedragok);
            categorienFilter.forEach(function(item) {
                var dataArray = [];
                dataArray.push(item.omschrijving);
                dataArray.push(item.bedragAf);
                _categorien.push(dataArray);
            });
            return _categorien;
        }
	});

function MainController() {
	this.data = [
        {
            	bedragAf: 100,
            	omschrijving: 'test'
        },
        {
            	bedragAf: -100,
            	omschrijving: 'test neg. value'
        },
        {
            	bedragAf: 100,
            	omschrijving: 'test2'
        }
    ];        
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="demoApp" ng-controller="MainController as ctrl">
    <pre>
raw: 
{{ctrl.data | json : 2}}
        
filtered:
{{ctrl.data | categoryFilter | json : 2}}
    </pre>
</div>
&#13;
&#13;
&#13;