2016-07-11 35 views
0

我是相当新的角度和我想知道如何实现以下目标:使用更新三元条件的可变角

林三元条件在我的变量两种语言之间进行切换,而无需刷新我的网页,并显示项目(ng-repeat )与正确的标题。

{{isEnglish ? item.name_en : item.name_fr}} 

我有一个拨动开关isEnglishtruefalse,但切换布尔当变量不更新自己。我需要应用更改吗?有没有办法呢?

语言切换

<a href="" class="fb border_link" ng-click="changelanguage();"> 
    {{displayLanguage}} 
</a> 

NG-点击功能

$scope.changelanguage = function(){ 
    console.log("changing language"); 
    console.log($scope.$parent.isEnglish); 
    if($scope.selectedLanguage === 'en'){ 
     $translate.use('fr'); 
     $scope.$parent.isEnglish = false; 
     console.log($scope.$parent.isEnglish); 
     $scope.selectedLanguage = 'fr'; 
     $scope.displayLanguage = 'English'; 
     console.log("en"); 
    } 
    else{ 
     $translate.use('en'); 
     $scope.$parent.isEnglish = true; 
     console.log($scope.$parent.isEnglish); 
     $scope.selectedLanguage = 'en'; 
     $scope.displayLanguage = 'Français'; 
     console.log("fr"); 
    } 
    } 
+0

你可以发布更多的代码.. – developer033

+0

完成,如果有帮助。三元条件在ng-repeat div内 – SKYnine

+0

@SKYnine:查看我的第二个更新。 –

回答

2

尝试使isEnglish成为一个对象属性,如settings.isEnglish。 Angular有一些原始变量附加到范围上的问题。

+0

似乎不工作:( – SKYnine

+0

@ SKYnine首先我强烈建议不要使用$ parent,而只是使用一个服务在两个不同的范围内使用相同的数据。另外,isEnglish也不应该是一个变量,它应该是一个函数(或者你甚至可以尝试在视图中执行检查权限),方法是返回$ scope.selectedLanguage ==='en'。另外,像selectedLanguage和displayLanguage这样的原始变量(可以使用两个不同的变量)可以在一个对象中,就像我一样在我的回答中说,以避免任何麻烦。给我一个尝试,并拍我回。 – GMaiolo

+0

我做了一个对象,我的设置,它开始工作。我不能使用服务,因为我需要范围变量是动态的,不仅不管怎么样,不要不明白为什么它开始工作(因为我昨天尝试了物体形状) – SKYnine

0

更新2:既然你分配isEnglish$scope.$parent你可以有一个$scope - 相关问题。

为了帮助排除故障,我会使用类似Batarang的东西来找出$scope.isEnglish对各种$scope的值。或者,您可以在您的三元组旁边放置一个{{ isEnglish }}绑定,以确认在调用changelanguage时正在设置isEnglish。如果不是这样,它会降低你的孩子和孤立示波器的结构。


更新1:您在问题中发布的代码正常工作。这是一个工作plunkr。从你的评论来看,也许你有一个你在ng-click中指定的孩子范围。您是直接在ng-click表达式中完成作业还是通过某种方法完成作业(如在我的plunkr中)?

JS

app.controller('MainCtrl', function($scope) { 
    $scope.isEnglish = true; 

    $scope.toggle = function _toggle() { 
    $scope.isEnglish = !$scope.isEnglish; 
    }; 

    $scope.item = { 
    name_en: 'en name', 
    name_fr: 'fr name' 
    }; 
}); 

HTML

<body ng-controller="MainCtrl"> 
    <div> 
    <button ng-click="toggle()"> 
     Toggle isEnglish 
    </button> 
    </div> 
    <br> 
    <br> 

    <div> 
    isEnglish: 
    </div> 
    <div> 
    <b>{{ isEnglish }}</b> 
    </div> 
    <br> 

    <div> 
    isEnglish ? item.name_en : item.name_fr: 
    </div> 
    <div> 
    <b>{{isEnglish ? item.name_en : item.name_fr}}</b> 
    </div> 
</body> 

您可能需要包装的切换在$scope.apply电话,如果是这样的事情发生在消化外的自定义指令周期:

// 'scope' is argument in directive link function. 
function toggle() { 
    scope.$apply(function() { 
    scope.isEnglish = !scope.isEnglish; 
    }); 
} 
+1

$ scope.isEnglish在ng-click函数中更改,因此digest循环已在进行中。使用$ apply()之内会触发错误。该函数的所有内容都按预期工作,即使是英文切换。它只是html中的变量,不会自行更新... – SKYnine

+0

总是建议包装$ scope。$在$ timeout调用中应用,因此它不会与正在进行的$ digest流冲突。 – GMaiolo

+0

添加一个$超时确实可以防止$ apply触发错误。但结果是一样的,它不更新变量:( – SKYnine