角度控制器范围项作为范围函数的子项

时间:2016-02-02 10:51:34

标签: javascript angularjs

我是棱角分明的新手js一般来说,并遵循Dan Wahlin的一个很棒的教程,它展示了如何将角客户端连接到REST接口。

我正在调用REST接口来获取大量数据,然后使用客户端对数据,计算等做有用的事情。

我无法弄清楚如何从控制器内的REST工厂中干净地操作数据。

在我的MainController.js中,我可以获取订单数据并将其声明为范围项:

app.controller('MainController', ['$scope', 'dataFactory', function($scope, dataFactory) {
    $scope.orders;
    getOrders();

    function getOrders() {
        dataFactory.getOrders()
            .success(function (ord) {
                $scope.orders = ord;
            })
            .error(function (error) {
                $scope.status = 'Unable to load order data: ' + error.message;
            });
    }
}

现在我想使用返回的$ scope.orders数组中的数据在控制器内部进行操作。当我试图找到这样的长度时,它起作用:

function getOrders() {
        dataFactory.getOrders()
            .success(function (ord) {
                $scope.orders = ord;
                // This is me using the $scope.orders data to declare another controller item
                $scope.ordersCount = $scope.orders.length;
                })
                .error(function (error) {
                    $scope.status = 'Unable to load order data: ' + error.message;
                });
        }

但是,我需要使用$ scope.orders变量中的数据以不同的方式添加大量不同的项目。我可以像上面的$ scope.ordersCount项一样在函数内部完成所有操作,但代码看起来很乱,如果我在这里添加不同类型的计算,函数会变得更长并且看起来不对。但是,当我尝试访问函数外部的$ scope.orders数组时,它不起作用。这是我试过的:

$scope.orders = getOrders();

    function getOrders() {
        dataFactory.getOrders()
            .success(function (ord) {
                $scope.orders = ord;
                // I also tried 'return ord' here too
            })
            .error(function (error) {
                $scope.status = 'Unable to load order data: ' + error.message;
            });
    }

    $scope.ordersCount = $scope.orders.length;

我做错了什么?如何将我的数组声明为$ scope.orders,然后在函数外使用它?

目前控制台只是给我“无法读取未定义的属性长度”,这告诉我我的$ scope.orders在函数外部不可用。

2 个答案:

答案 0 :(得分:2)

在上面的代码示例中,您的其他服务需要一些时间来获取数据并与$ scope.orders绑定,然后您的代码行$ scope.ordersCount = $ scope.orders.length;执行,因为你在控制台中得到未定义的错误。

试试这个:

$scope.orders = getOrders();

function getOrders() {
    dataFactory.getOrders()
        .success(function (ord) {
            $scope.orders = ord;
            // I also tried 'return ord' here too
        })
        .error(function (error) {
            $scope.status = 'Unable to load order data: ' + error.message;
        });
       $scope.ordersCount = $scope.orders.length; // Just putting this line inside rest function
       console.log($scope.ordersCount)
}

答案 1 :(得分:1)

您应该更改

 dataFactory.getOrders()
            .success(function (ord) {
                $scope.orders = ord;
                // I also tried 'return ord' here too
            })

通过ajax加载后,如下所示。

$scope.$watch('orders', function() {
        // called when $scope.orders changes.
        $scope.ordersCount = $scope.orders.length;
    }, true);

因此,角度1的最佳方法是在控制器内使用$ watch。

SELECT  Data_Type INTO TargetFieldType FROM information_schema.COLUMNS
    WHERE information_schema.COLUMNS.COLUMN_NAME= TargetFieldName
    AND information_schema.COLUMNS.TABLE_NAME=TableName
    AND information_schema.COLUMNS.TABLE_SCHEMA='WMC'; 

    IF (( FIND_IN_SET(@TargetFieldType ,'VARCHAR')= TRUE ) 
    OR (FIND_IN_SET(TargetFieldType,'TEXT')= TRUE ) 
    OR (FIND_IN_SET(TargetFieldType,'LONTTEXT')= TRUE)  
    OR (FIND_IN_SET(TargetFieldType,'CHAR')= TRUE)   ) THEN
    SET TargetFieldValue = '''' + TargetFieldValue +'''';
    END IF ;

参考here

希望这有帮助!