从页面上的按钮更新页面上的元素 CSS

Updating element CSS on PageA from button on PageB

我正在为一个应用程序使用标签。我想要一个用户按钮,当单击 tab-detail.html 时,它会更新其父标签页 tab.html

上元素的 CSS
.controller('TabCtrl', function($scope,Tabs) {
    $scope.tabs = Tabs.all() ;
    // this populates the "tab.html" template
    // an element on this page is: <span id="tab_selected_1">
    // when user selects a listed item on tab.html
    // it calls tab-detail.html
})

.controller('TabDetailCtrl', function($scope,$stateparams,Tabs) {
   $scope.tabs = Tabs.get($stateparams.tabID) ;
    // on tab-detail.html is a button <button ng-click="tabSelect()">
   $scope.tabSelect = function(thisID) {
      // update css on TabCtrl elementID
      document.getElementById('tab_selected_1').style.color = "green" ;
   }
})

进入 tab-detail.html 的唯一方法是通过 tab.html,因此必须加载 tab.html。但是无论我尝试什么方法,我似乎都无法找到一种方法来访问另一个控制器页面上的元素。

我试过:

var e = angluar.element('tab_selected_1');

var e = angluar.element(document.querySelector('tab_selected_1') ;
e.style.color = "green" ;

您正在做的方法永远不会为您完成工作,因为您想要的 DOM 不可用。您可以通过创建一个可共享服务来实现这一点,该服务将在其中维护所有这些变量,并将在 UI 上使用。为了确保它们的绑定,您的服务变量应该在 object 结构中,例如 styleData 或者您也可以通过创建 angular 常量来实现。

app.constant('constants', {
   data: {
   }
});

然后你可以在你的控制器中注入这个常量并修改它。

.controller('TabCtrl', function($scope, Tabs, constants) {
    $scope.constants = constants; //make it available constants on html
    $scope.tabs = Tabs.all() ;
    // this populates the "tab.html" template
    // an element on this page is: <span id="tab_selected_1">
    // when user selects a listed item on tab.html
    // it calls tab-detail.html
})

.controller('TabDetailCtrl', function($scope,$stateparams,Tabs, constants) {
   $scope.tabs = Tabs.get($stateparams.tabID) ;
   $scope.constants= constants; //make it available constants on html
    // on tab-detail.html is a button <button ng-click="tabSelect()">
   $scope.tabSelect = function(thisID) {
      // update css on TabCtrl elementID
      $scope.constants.data.color = "green" ;
   }
})

标记

<div id="tab_selected_1" ng-style="{color: constants.data.color || 'black'}">

一种方法是...... 1)创建服务 2) 在单击按钮时为服务中的变量设置一个值(tab-detail.html) 3) 在 tab.html

中使用该服务变量值

(更正更新在底部)

@pankajparkar 解决方案确实有效,但它不适用于 IONIC,因为 IONIC 框架以某种方式覆盖了 DOM 设置。通过 DOM 元素检查器可以看到:style='color:green' 被内联添加到 ITEM/SPAN 并且可以看到元素定义为:element.style{ color: green}...但是渲染的颜色 HTML 没有改变....它保持黑色。

进一步的研究表明这在某种程度上是一个 IONIC 问题,因为其他用户也有同样的问题。其他 SOF 和博客表明似乎有解决方法,但我还没有看到它起作用。

以上内容已重新格式化以供其他人将来使用(即使它不适用于 IONIC),因此我仍在寻找与 IONIC 一起使用的解决方案:

.constant('constants', {
   tabColors: {
     curID:0,
   },
}) 

.controller('TabCtrl', function($scope,Tabs,constants) {
  $scope.constants = constants; 
}

.controller('TabDetailCtrl', function($scope,$stateparams,Tabs,constants) {
  $scope.constants = constants; 
  $scope.setItem= function(thisID) {
    $scope.constants.tabColors.oldID = $scope.constants.tabColors.curID ;
    delete $scope.constants.tabColors['tabID_'+$scope.constants.tabColors.curID] ;
    $scope.constants.tabColors.curID = thisID ;
    $scope.constants.tabColors['tabID_'+thisID] = 'green' ;
}

// HTML in Tab.html
<span id='tab_tabID_{{tab.tabID}}' ng-style="{color: constants.tabColors['tabID_'+tab.tabID] || 'black'}">
Some Text Here
</span>

//HTML in TabDetail.html
<button id="tab_button" class="button button-small button-outline button-positive" ng-click="setItem({{tab.tabID}});">
   Select This Item
</button> 

更正:此方法确实有效,并且适用于 IONIC。 IONIC 的问题是嵌入在离子标签中的每个元素 <ion-item>... <ion-nav> ...等从预定义的 classes 继承其自己的属性...因此您必须更新 class(不是最佳的)或在每个元素 and/or 上应用 ID 标签 CSS 更改(使用上述方法)到每个子元素。这不是最佳的,但它会起作用。

在我的例子中,我的 HTML 实际上看起来像:

<span id='tab_tabID_{{tab.tabID}}' ng-style="{color: constants.tabColors['tabID_'+tab.tabID] || 'black'}">
  <h2>Header Text Here</h>
  <p>More text here</p>
</span>

上述 CSS 方法适用于此:

<span id='tab_tabID_{{tab.tabID}}'>
  <h2  ng-style="{color: constants.tabColors['tabID_'+tab.tabID] || 'black'}">
    Header Text Here
  </h>
  <p  ng-style="{color: constants.tabColors['tabID_'+tab.tabID] || 'black'}">
    More text here
  </p>
</span>