【问题标题】:Angular Routes- force reload/new data in dynamic URLAngular Routes-在动态 URL 中强制重新加载/新数据
【发布时间】:2023-03-18 06:31:01
【问题描述】:

当我在我的应用中点击“产品”时,它会使用 URL (#/product/123) 来识别产品。

然后我使用 .split 函数告诉 API 从何处提取单个产品详细信息。

它会加载第一个项目的数据,并且在我刷新浏览器之前该数据不会改变。就好像它认为每个 /product/# 都是同一个页面。

我可以强制它重新加载路线的产品页面吗?也许还有更好的解决方案。

我的部分路线:

        .state('product', {
            url: '/product/:id',
            views: {
                'menuContent': {
                    templateUrl: 'app/components/product/product.html',
                    controller : 'productsCtrl',
                    controllerAs : 'pro',
                    resolve : {
                        products : function productDetailsResolve ($stateParams, productsApi, $log) {
                            return productsApi.getApiData($stateParams.id)
                                .then(function (result) {
                                    return result.data;
                                })
                                .catch(function (err) {
                                    $log.error(err);
                                });
                        }
                    }
                }
            }
        })

“产品”页面的 JS:

.factory('productsApi', ['$http', '$location',
    function($http, $location){
        var BASE_URL = 'http://localhost:8000/api/item/';
        var getApiData = function(product_id) {
            return $http.get(BASE_URL + product_id);
        };
        return {
            getApiData: getApiData
        };
    }]
)

.controller('productsCtrl', ['$scope', '$log', 'productsApi', 'UserService', 'products',
    function($scope, $log, productsApi, UserService, products) {
        var self = this;
        self.products = products;

        $scope.isVisible = function(name){
            return true;// return false to hide this artist's albums
        };

        // <======  Rewrite with accounts preferences
        productsApi.getApiData()
            .then(function (result) {
                console.log(JSON.stringify(result.data)) //Shows log of API incoming
                $scope.products = result.data;
            })
            .catch(function (err) {
                $log.error(err);
            });
    }
]);

产品 HTML 页面:

<ion-view name="product" hide-nav-bar="true">
    <ion-pane ng-controller="productsCtrl">

        <!--<ion-pane ng-controller="storesCtrl">-->


        <ion-content>

<div class="-""slidebox">

            <ion-slide-box show-pager="true" auto-play="true" does-continue="true">
                <!--<ion-slide ng-repeat="wardrobe in wardrobes">-->
                    <img style="width:100%" src="{{products.image}}">
                </ion-slide>
            </ion-slide-box>
            <div class="customback">
                <i class="ion-chevron-down" native-ui-sref="cards" native-ui-sref-opts="{reload: true}" native-options="{type: 'slide', direction:'down'}">
                </i>
            </div>
            </div>
            <center>
                    <h1>{{products.name}}</h1>
                    <br>
                    <P>${{products.price}}</p>
                    <br>
                    {{products.description}}</b>
        </ion-content>

【问题讨论】:

  • 几个问题让您清楚地了解您的问题..1) 状态product 用于显示与 URL 中的 id 有关的产品详细信息,并且在更改 id 时仍显示旧数据在网址中?? 2) 你在哪里包括productsCtrl ??。如果可能的话,您能否为此问题提供小提琴或 plunker 链接。
  • 正确 - 即使 URL 中的 id 已更改,它也会显示旧数据。我在我的 html 中包含 productsCtrl(将在上面上传)。不幸的是,我不能提供一个 plunker。
  • 那么最好的方法是在 ui-router 中使用 resolves 。将发布代码。

标签: angularjs ionic-framework angular-ui-router


【解决方案1】:

这是工作代码。 ui-routercontrollerfactory 代码现在在同一个 js 文件中。如果您要将代码放在不同的文件中,则将这些 js 文件包含在 index.html 中。

var myapp = angular.module('myapp', ["ui.router"]);
 myapp.config(function($stateProvider, $urlRouterProvider){
  $stateProvider
    .state('product', {
        url: "/product/:id",
        templateUrl: "products.html",
        controller : 'productsCtrl',
        controllerAs : 'pro',
        resolve : {
            products : function productDetailsResolve ($stateParams, productsApi, $log) {
                    return productsApi.getApiData($stateParams.id)
                        .then(function (result) {
                            return result.data;
                        })
                        .catch(function (err) {
                            $log.error(err);
                        });
                }
        }
    })
});
myapp.factory('productsApi', ['$http', '$location',
function($http, $location){
    var BASE_URL = 'http://localhost:8000/api/item/';
    var getApiData = function(product_id) {
        return $http.get(BASE_URL + product_id);
    };
    return {
        getApiData: getApiData
    };
}]);
myapp.controller('productsCtrl', ['$scope', 'products',function($scope, products) {
          var self = this;
          self.products = products             
          // add rest of the controller code here
}]);

现在您可以通过{{pro.products}} 访问视图中的数据

【讨论】:

  • 请解释您使用pro.products访问产品详细信息的意思。此外,我无法让控制器在我的示例中工作。我已经在上面的问题中发布了它。
  • proui-router 状态中提到的控制器productsCtrl 的别名。你可以给任何你想要的名字。 ui-router 中解析的数据products 被传递给productsCtrl 并分配self.products。因此,要在视图中访问此控制器数据,请使用“pro.products”。
  • cannot get the controller working 是什么意思??你遇到什么问题了??
  • 可能是语法。请参阅上面有问题的代码。另外,如果我不使用 productsCtrl,我应该使用“pro”作为我的 HTML 的 ng-controller 吗?
  • 控制器解析会在getApiData失败时崩溃,因为$log未定义
猜你喜欢
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2017-05-30
  • 2015-10-05
  • 2015-01-28
  • 2014-09-18
相关资源
最近更新 更多