javascript - 单击 ng 时重新加载模型

标签 javascript angularjs angularjs-directive angularjs-scope angularjs-ng-click

这是我的 HTML 代码:

<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Angular App</title>
<script type="text/javascript" src="resources/angularJs-1.2.22/angular.js"></script>
<script type="text/javascript" src="resources/angularJs-1.2.22/angular-animate.js"></script>
<script type="text/javascript" src="resources/angularJs-1.2.22/angular-cookies.js"></script>
<script type="text/javascript" src="resources/angularJs-1.2.22/angular-mocks.js"></script>
<script type="text/javascript" src="resources/angularJs-1.2.22/angular-resource.js"></script>
<script type="text/javascript" src="resources/angularJs-1.2.22/angular-route.js"></script>
<script type="text/javascript" src="resources/angularJs-1.2.22/angular-sanitize.js"></script>
<script type="text/javascript" src="resources/angularJs-1.2.22/angular-touch.js"></script>
<script type="text/javascript" src="resources/angularJs-1.2.22/i18n/angular-locale_fr-fr.js"></script>

<script type="text/javascript" src="js/app.js"></script>
<script type="text/javascript" src="js/controllers/controller.js"></script>
<script type="text/javascript" src="js/directives/directive.js"></script>
<script type="text/javascript" src="js/filters/filter.js"></script>
<script type="text/javascript" src="js/services/service.js"></script>

<!-- flatUI -->
<!-- Loading Bootstrap -->
<link href="resources/flatUI/bootstrap/css/bootstrap.css" rel="stylesheet">
<link href="resources/flatUI/bootstrap/css/prettify.css" rel="stylesheet">
<!-- Loading Flat UI -->
<link href="resources/flatUI/css/flat-ui.css" rel="stylesheet">
<link href="resources/flatUI/css/docs.css" rel="stylesheet">

<link rel="stylesheet" href="css/style.css">
</head>
<body ng-controller="defaultController">
    <table class="table table-striped">
        <thead>
            <tr>
                <th>Name</th>
                <th>Price</th>
            </tr>
        </thead>
        <tbody>
            <tr simple-repeater source="products" item-name="item">
                <td>{{item.name}}</td>
                <td>{{item.price | currency}}</td>
            </tr>
        </tbody>
    </table>
    <button class="btn btn-default text" ng-click="changeData()">Change</button>
</body>
</html>

这是我的 Controller :

app.controller("defaultController", function($scope)
{
    $scope.dataSource= "controller";

    $scope.products = [{ name: "Apples", price: 1.20 },
                       { name: "Bananas", price: 2.42 }, 
                       { name: "Pears", price: 2.02 }];

    $scope.changeData = function()
    {
        var data = [{ name: "Apples1", price: 1.20 },
                       { name: "Bananas1", price: 2.42 }, 
                       { name: "Pears1", price: 2.02 }];

        $scope.products.length = 0;
        for (var i = 0; i < data.length; i++)
        {
            $scope.products.push(data[i]);
        }
    }
})

这是我的指令:

app.directive("simpleRepeater", function()
{
    return {
        scope: {
            data: "=source",
            propName: "@itemName"
        },
        transclude: 'element',
        compile: function(element, attrs, transcludeFn)
        {
            return function($scope, $element, $attr)
            {
                $scope.$watch("data.length", function()
                {
                    var parent = $element.parent();
                    parent.children().remove();
                    for (var i = 0; i < $scope.data.length; i++)
                    {
                        var childScope = $scope.$new();
                        childScope[$scope.propName] = $scope.data[i];
                        transcludeFn(childScope, function(clone)
                        {
                            parent.append(clone);
                        })
                    }
                })
            }
        }
    }
})

我想做的就是在点击时重新加载我的模型,即必须删除所有旧数据并加载新数据,有人可以告诉我新数据到底错在哪里吗?没有更新 View ,任何帮助将不胜感激,谢谢。

最佳答案

使用$watchCollection而不是 $watch。在您的情况下,您的数组不会改变长度,您想要检测其内容的变化。所以你需要观察数组本身,而不仅仅是长度:

$scope.$watchCollection("data", function () {
    var parent = $element.parent();
    parent.children().remove();
    for (var i = 0; i < $scope.data.length; i++) {
        var childScope = $scope.$new();
        childScope[$scope.propName] = $scope.data[i];
        transcludeFn(childScope, function (clone) {
            parent.append(clone);
        });
    }
});

演示:http://plnkr.co/edit/6mbHQhLldf28BnFVaQu1?p=preview

关于javascript - 单击 ng 时重新加载模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26404763/

相关文章:

javascript - 在指令中使用相同的指令 [angularjs]

javascript - AngularJS:$http.get方法下载pdf文件

javascript - 识别 Angular 引导下拉菜单何时关闭

javascript - 具有冲突值的多个 'X-Frame-Options' header

php - paypal付款后才访问页面?

angularjs - 如何从 Angular 表达式中的全局 API 调用函数?

angularjs - 访问由于 Angular ui 选项卡隔离/继承范围而隐藏的表单 Controller

javascript - 如何更新 AngularJS 指令中的类

用于验证输入中输入的最少字数的 JavaScript 脚本

javascript - 将鼠标悬停在同级上会停止悬停效果