以下是我要做的事情的描述:
我目前在我的网络应用程序上有一个angular.module
我正在构建一个价格计算器,用户可以在这里计算他们希望留在酒店并拥有模块的天数/周计算他们想要留下的日期所包含的费用/天/周的估计价格。
我目前通过angular.factory
(见下文)从我的controller
中选择季节选择菜单。用户可以从我在工厂中存储的不同选项中选择对象文字,并根据他们在菜单中选择的“标签”,它将根据在这家酒店住宿1周计算他们的价格。大。
现在我想通过[Revolunet / angular-stepper] [1]指令为我的步进器添加一些功能,我已选择将其用作每天和每周的步进器。
我遇到的问题是我不确定在哪里做我的计算逻辑。我希望用户能够在选择菜单中选择一个季节,然后使用步进器使用步进器添加任何额外的天/周,并根据用户选择的天/周动态调整估计总数
我知道我不能让控制器彼此交谈,除了我设置的$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];
});
答案 0 :(得分:1)
你绝对可以让你的控制器互相交谈,并且在weekStepper和dayStepper之间已经有了父子关系,因为在你的html中,day会在一周内嵌套。
您可以在day stepper中使用$ parent与weekStepper控制器通信,或者由于它们是嵌套的,因此子控制器将自动继承父级的属性。
但是,由于您已经设置了工厂,只需将工厂注入每个控制器并从那里访问属性。工厂是单件,所以即使将它注入每个控制器,所有这些引用都将指向同一个实例并具有相同的数据。
基于我上面所说的,如果你将控制器嵌入你的html中,如果你将seasonFactory注入到weekStepper并将其存储到一个属性(比如季工厂)中,那么$ scope.seasonFactory将在所有的控制器。您可以在检索后将数据存储在工厂中,或者将存储工厂方法结果的代码移动到最外层的控制器,并使其在任何地方都可用。
关于父母和母亲,这里有很多很棒的问题和答案。儿童管制员。这是最受欢迎的一个:AngularJS access parent scope from child controller
此外,如果您使用角度1.5或更高版本,这将是开始使用组件的绝佳机会。