AngularJS Controller 执行两次

标签 angularjs

我必须补充一点,我正在研究 Sharepoint 2013,可视化 Web 部件。
我的 ascx:

<%@ Control Language="C#" Inherits="SharePoint.BLL.UserControls.VODCatalog, SharePoint.BLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=81fc048468441ab3" %>
<%@ Register TagPrefix="SPWP" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls"  Assembly="Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>


<div ng-app="VODCatalogModule">
    <div class="wrapper" ng-view="">   
    </div>
</div>

我的JS:
var VODCatalogModule = angular.module('VODCatalogModule', []);

var testWPDefinedView = 'TopLevelView';

VODCatalogModule.config(function ($routeProvider) {
    $routeProvider.when('/TopLevelView', { controller: 'VODCatalogController', templateUrl: '/_catalogs/masterpage/html/VODCatalog_TopLevelView.html' })
                  .when('/LowLevelView', { controller: 'VODCatalogController', templateUrl: '/_catalogs/masterpage/html/VODCatalog_LowLevelView.html' })
                  .otherwise({ redirectTo: '/' + testWPDefinedView });
});

function VODCatalogController($scope, $http) {
    $scope.VODCatalogLevel = 1;
    $scope.BreadCrumbs = [];
    $scope.MainCatalog = [];
    $scope.NavCatalog = [];
    $scope.crumbsVisible = $scope.BreadCrumbs.length == 0 ? "hidden" : "";

    var getVODCatalogData = function (PARENT_VOD_CATALOG_GK, vodLevel) {
        var url = "VODCatalogHandler.ashx?action=GetVODCatalogData&vodLevel=" + vodLevel;
        if (PARENT_VOD_CATALOG_GK)
            url += "&PARENT_VOD_CATALOG_GK=" + PARENT_VOD_CATALOG_GK;
        $http.get(url, { cache: true })
            .success(function (data, status, headers, config) {
                setVODCatalogData(data, vodLevel);
            }).error(function (data, status, headers, config) {
                alert('ERROR in VODCatalogDataService get');
            });
    };

    var setVODCatalogData = function (data, vodLevel) {
        $scope.BreadCrumbs = data;
        $scope.MainCatalog = data;
        $scope.NavCatalog = data;
    };

    $scope.catalogItemClick = function (catalogItem) {
        getVODCatalogData(catalogItem.VOD_CATALOG_GK, ++$scope.VODCatalogLevel);
    };

    getVODCatalogData(null, $scope.VODCatalogLevel);
}

VODCatalogModule.controller("VODCatalogController", VODCatalogController);

我的观点(VODCatalog_TopLevelView.html):
<section class="zebra brightBGcolor">
    <div class="catalog">
        <div class="centerPage">
            <div class="pageTitle withBreadCrumbs">
                <h3>VOD</h3>
                <ul class="breadCrumbs {{ crumbsVisible }}">
                    <li>
                        <a href="#">VOD</a>
                    </li>
                    <li ng-repeat-start="crumb in BreadCrumbs">
                        <span>&nbsp;</span>
                    </li>
                    <li ng-repeat-end>
                        <a href="#">{{ crumb.NAME }}</a>
                    </li>
                </ul>
            </div>
            <ul class="list inRow4 clearfix">
                <li ng-repeat="catalogItem in MainCatalog" ng-click="catalogItemClick(catalogItem)">
                    <a class="box" href="#">
                        <img src="{{ catalogItem.MEDIA_URI_Complete}}" alt="">
                        <div class="textContainer">
                            <h4>{{ catalogItem.NAME }}</h4>
                        </div>
                    </a>
                </li>
            </ul>
        </div>
    </div>
</section>

一开始一切看起来都很棒,它加载了第一个 ajax 调用,其中包含所有图片和数据。

然后,当我用 ng-click 单击 li 中的一个时,第二个 ajax 会执行两次,一旦它获得正确的数据,然后立即通过 getVODCatalogData(null, $scope.VODCatalogLevel); 的初始调用再次调用自己;并带回旧 View 。

当我尝试在 module.run 中放入一些东西时,它也会运行两次,有帮助吗?

我很感激任何提示和帮助,因为这是我第一次使用 angular。

谢谢!
阿里尔

编辑:
更多信息 - 我在 Controller 的开头放了一个日志,点击后 Controller 再次初始化

最佳答案

如果 Controller 在 $routeProvider 中指定并且在 HTML 模板中,它将为每个声明创建一次。

关于AngularJS Controller 执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18079242/

相关文章:

javascript - 如何根据单击的项目获取模态框中的值

css - Angularjs 1.3.1 ng-repeat css 动画没有任何反应

angularjs - 指令中的 UI 引导模式

javascript - 如何清除模糊时的无效日期字段? (AngularJS)

java - 如何在服务器上处理动态变化的 JSESSIONID

javascript - Angular js 多个或单个 Controller ?

javascript - 使 img src 可通过变量更改

angularjs - 列出在 AngularJS 中注册的自定义指令

javascript - 如何使 ng-repeat 与返回新对象的函数一起工作?

angularjs - UI-路由器 : Prevent access to parent state