2016-06-14 71 views
1

我正在创建一个自定义下拉菜单。我设法让指令代码取代它。如何将值绑定到angularjs指令?

下面是在html

<dropdown placeholder="Country.." list="count" selected="item" property="name"></dropdown> 

下面的指令标签HTML模板替换指令标签

<div class="dropdown-container" ng-class="{ show: listVisible }"> 
<div class="dropdown-list"> 
    <div> 
     <div ng-repeat="item in list" ng-click="select(item)" ng-class="{ selected: isSelected(item) }"> 
      <span>{{property !== undefined ? item[property] : item}}</span> 
      <i class="fa fa-check"></i> 
     </div> 
    </div> 
</div> 

下面是angularjs指令

App.directive("dropdown", function ($rootScope) { 
return { 
    restrict: "E", 
    templateUrl: "/app/dropdownTemplate.html", 
    scope: { 
     placeholder: "@", 
     list: "=", 
     selected: "=", 
     property: "@" 
    }, 
    link: function (scope) { 
     scope.listVisible = false; 
     scope.isPlaceholder = true; 

     scope.select = function (item) { 
      scope.isPlaceholder = false; 
      scope.selected = item; 
     }; 

     scope.isSelected = function (item) { 
      return item[scope.property] === scope.selected[scope.property]; 
     }; 

     scope.show = function() { 
      scope.listVisible = true; 
     }; 

     $rootScope.$on("documentClicked", function (inner, target) { 
      console.log($(target[0]).is(".dropdown-display.clicked") || $(target[0]).parents(".dropdown-display.clicked").length > 0); 
      if (!$(target[0]).is(".dropdown-display.clicked") && !$(target[0]).parents(".dropdown-display.clicked").length > 0) 
       scope.$apply(function() { 
        scope.listVisible = false; 
       }); 
     }); 

     scope.$watch("selected", function (value) { 
      scope.isPlaceholder = scope.selected[scope.property] === undefined; 
      scope.display = scope.selected[scope.property]; 
     }); 
    } 
} 
}); 

我想从另一个控制器,其功能如下得到国家的名单,

addressService.getCountries().success(function (response) { 
    angular.copy(response, $scope.list); 
} 

如何绑定从控制器到我的指令,在页面加载时的值?

编辑:我该怎么做,因为指令加载功能addressService.getCountries()被调用之前加载?

+0

只需绑定列表使用双向绑定('=')将'scope.list'指向'scope {}'中的另一个属性? –

+0

使用服务传递数据 – Kailas

+0

@NexusDuck请您详细说明一下吗?我无法理解怎么加属性'范围{}' – Rai

回答

0

你可以做一个工厂,这将是有益的整个项目,使做出变量访问,随时随地,在任何控制器或任何指令要使用变量,你可以轻松地访问

这是怎么了我们可以做工厂,

(function() { 
"use strict"; 
angular.module('dataModule',[]) 
.factory('datafactory',function(){ 
return { 
credentials : {}, 
}; 
}); 
})(); 

在控制器

使这家工厂,你可以你的模块中注入该模块和这家工厂后,只要你想,你可以使用这个喜欢

addressService.getCountries().success(function (response) { 
datafactory.country = response 
} 
在控制器

$scope.myvar =datafactory.country 

在未来使用这家工厂任何这样的变量可以被访问无处不在,比如你想存储状态全局

datafactory.state =["abc","def","xyz"] 
+0

谢谢你的建议。将从下一个项目开始实施这项技术。 – Rai

+0

您可以详细说明为什么您要返回'credentials:{},' – Rai

+0

凭证在这种情况下是没有用的,它仅仅是虚拟对象,我们返回一些对象,我们可以删除它或保留它没有问题,它只是这里 即使我们消除我们的工厂将是这样的,它会正常工作 (函数(){ “使用严格的”虚拟对象; angular.module(“数据模块”,[]) 。工厂('datafactory',function(){ return { }; }); })(); –