gpt4 book ai didi

javascript - 在 Angular.js 中使用工厂和 Controller 之间的逻辑

转载 作者:行者123 更新时间:2023-12-03 02:45:43 25 4
gpt4 key购买 nike

这是我正在尝试做的事情的描述:

我目前在我正在构建的网络应用程序上有一个 angular.module,它是一个价格计算器,用户可以在其中输入他们想要入住的天数/周数。酒店并让模块计算他们的估计价格,其中包括他们想要入住的日期的费用/天/周。

我目前通过 Controller 从我的angular.factory中提取季节的选择菜单(见下文)。用户可以从我作为对象文字存储在工厂中的不同选项中进行选择,并根据他们在菜单中选择的“标签”,它将根据在这家酒店的 1 周住宿来计算他们的价格。太棒了。

现在,我想向我通过 [Revolunet/angular-stepper][1] 指令设置的步进器添加一些功能,我选择将其用作每天和每周的步进器。

我遇到的问题是我不确定在哪里进行计算逻辑。我希望用户能够在选择菜单中选择一个季节,然后使用步进器添加任何额外的天/周,并根据用户选择的天/周动态调整估计总数.

我知道我不能让 Controller 相互通信,也不能让 $scope 查找除了我设置的 app.factory 之外的任何全局变量?我可以将所有 Angular-Stepper 内容存储在工厂中并让我的 App.controller 继承它吗?

因此,总而言之,当用户使用我提供的步进器向他们的请求添加天数和周数时,我想动态更改价格估算器的美元金额,并且我不知道在哪里放置我的逻辑。我希望这是有道理的!

这是我的代码:

HTML:

<div id= "estimator-wrapper" ng-app="priceEstimator">
<h3> Price Estimator</h3>
<h4> (with fees):</h4>
<div ng-controller="weekStepper">
<div ng-controller="seasonSelector">
<h2>{{ seasonsList.value }}</h2>
<p> Select a season:</p>
<select ng-model="seasonsList" ng-options="season as season.label for season in seasons"></select>
</div>
<label>Number of weeks:</label>
<div min="minRating" max="maxRating" ng-model="rating" rn-stepper></div>
<div ng-controller="dayStepper">
<label>Number of days:</label>
<div min="minRating" max="maxRating" ng-model="rating" rn-stepper></div>
</div>
</div>

这是我的 Angular.js 模块:

const app = angular.module('priceEstimator', ['revolunet.stepper']);

app.factory('seasonFactory', () => {
let factory = {};
let seasons = [
{ label:'-', value: '$' + 0},
{ label:'Fall/Winter', value: '$' + Math.floor((2100 + 245) * 1.115) },
{ label: 'Spring', value: '$' + Math.floor((2900 + 245) * 1.115) },
{ label: 'Summer', value: '$' + Math.floor((3995 + 245) * 1.115) }
];
factory.getSeasons = () => {
return seasons;
};
return factory;
});

app.controller("weekStepper",($scope) => {
$scope.rating = 0;
$scope.minRating = 0;
$scope.maxRating = 8;
});

app.controller("dayStepper",($scope) => {
$scope.rating = 0;
$scope.minRating = 0;
$scope.maxRating = 6;
});

app.controller("seasonSelector",($scope, seasonFactory) => {
$scope.Math = Math;
$scope.seasons = seasonFactory.getSeasons();
$scope.seasonsList = $scope.seasons[0];
});

最佳答案

您绝对可以让 Controller 相互通信,并且在 weekStepper 和 dayStepper 之间已经建立了父子关系,因为在 html 中,day 嵌套在 week 内。

您可以在 day stepper 中使用 $parent 与 weekStepper Controller 对话,或者由于它们是嵌套的,子 Controller 将自动继承父 Controller 的属性。

但是,由于您已经设置了工厂,只需将工厂注入(inject)每个 Controller 并从那里访问属性即可。工厂是单例的,因此即使将其注入(inject)到每个 Controller 中,所有这些引用都将指向同一实例并具有相同的数据。

根据我上面所说的,由于你的 Controller 是如何嵌套在你的html中的,如果你注入(inject)seasonFactory并进入weekStepper并将其存储到一个属性(比如季节工厂)中,那么$scope.seasonFactory将在所有 Controller 。您可以在检索数据后将数据存储在工厂中,或者将存储工厂方法结果的代码移动到最外层 Controller ,并使其在任何地方都可用。

这里有很多关于父子 Controller 的精彩问题和答案。这是最受欢迎的之一:AngularJS access parent scope from child controller

此外,如果您使用的是 Angular 1.5 或更高版本,这将是开始使用组件的绝佳机会。

关于javascript - 在 Angular.js 中使用工厂和 Controller 之间的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48103048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com