Я новичок в Angular и все еще изучаю.
Вот пример скрипки.
Я хотел бы знать, как мне преобразовать его в службу? Я нахожу, что писать setStatus на NavController
и HeaderController
кажется совершенно неправильным, есть ли лучший способ работать для этого?
сценарий
Когда пользователь нажимает кнопку close
, весь nav
который с фоном будет отображаться ни разу, когда пользователь нажимает кнопку menu
, nav
получит класс is-active
который делает блок отображения nav
.
JS
var app = angular.module('myapp', ['ngRoute']);
app.controller('NavController', function($rootScope, $scope) {
$rootScope.status = 'off';
this.setStatus = function(status) {
$rootScope.status = status;
};
});
app.controller('HeaderController', function($rootScope, $scope) {
this.setStatus = function(status) {
$rootScope.status = status;
};
});
DOM
<div ng-app="myapp">
<nav ng-controller="NavController as nav" ng-class="{ 'is-active': status == 'on' }" ng-init="nav.status" class="nav">
<div class="nav__wrapper">
<button ng-click="nav.setStatus('off')" class="nav__close">close</button>
</div>
</nav>
<header ng-controller="HeaderController as header">
<button ng-click="header.setStatus('on')">menu</button>
</header>
</div>
Любая помощь будет принята с благодарностью, спасибо!
Есть несколько вещей, которые вызвали проблему на JSFiddle
onload
которая анализирует путь скрипта до определения модуля myapp
, поэтому LoadType
на JSFiddle должен быть No Wrap-in<body>
Я исправил эти вещи, и ваш JSFiddle работал гладко;)
Теперь, касаясь фактической проблемы перемещения общих/разделяемых данных на фабрику/услугу, достигается путем создания простого заводского модуля, такого как ниже, и ссылающегося на все контроллеры
JS CODE:
myApp.factory('Data', function () {
return { FirstName: '' };
});
myApp.controller('FirstCtrl', function ($scope, Data) {
$scope.Data = Data;
});
myApp.controller('SecondCtrl', function ($scope, Data) {
$scope.Data = Data;
});
HTML-код:
<div ng-controller="FirstCtrl">
<input type="text" ng-model="Data.FirstName">
<br>Input is : <strong>{{Data.FirstName}}</strong>
</div>
<hr>
<div ng-controller="SecondCtrl">
Input should also be here: {{Data.FirstName}}
</div>
Демо-версия с использованием фабрики/сервиса @JSFiddle
Примечание. Использование $rootScope
для определения глобального объекта, такого как ваш текущий код, является достойным способом выполнения действий, но в любом случае это может быть достигнуто с помощью определения нового factory
модуля, такого как выше.
Рекомендации: