2015-04-02 273 views
0

我目前正在學習在AngularJs中使用指令,儘管我知道Angular 2.0仍然只是在alpha中,但我已經開始閱讀關於web的「爲角2.0準備」文章。將角度指令範圍傳遞給指令控制器

其中有相當一部分提到了離開鏈接函數,並使用控制器和bindToController只是爲了使指令更像Angular 2.0的「組件」。

我遇到的問題是,我真的不知道該怎麼我的指令範圍傳遞給我使用該指令控制器...
例如,給出以下指令時:

(function() { 
    'use strict'; 

    angular.module('app').directive('gidsImagePreview', imagePreview); 

    /* @ngInject */ 
    function imagePreview() { 
    var directive = { 
     restrict: 'EA', 
     templateUrl: 'scripts/directives/gidsImagePreview.directive.html', 
     scope : { 
      images : '=' 
     }, 
     controller: ImagePreviewController, 
     controllerAs: 'vm', 
      bindToController: true 
    }; 

    return directive; 
    } 

    /* @ngInject */ 
    function ImagePreviewController(){ 
     var self = this; 
     self.featured = self.images[0]; 
     self.preview = preview; 

     function preview(img){ 
      self.featured = img; 
     } 
    } 
})(); 

而下面的html「呼」的指令(vm.project.images是圖像對象的數組與文件名屬性):

<gids-image-preview images="vm.project.images"></gids-image-preview> 

那麼,是什麼讓我的「 SE ImagePreviewController中的「lf.images」總是未定義的?

閱讀this article,他/她似乎是在做我在做什麼(只是不能與數組對象)...

回答

0

事實證明,我在做的事情沒有什麼是錯的。這是一個計時問題。
我想在我的指令控制器中使用「圖像」的那一刻,它仍然是未定義的,因爲我的指令被綁定的主對象(project.images)尚未加載。
我已經在我的路由配置中加入了一個解析函數,以確保主對象在我的詳細頁面(包含指令)打開之前被加載。另外,爲了補充說明,@camden_kid提到我不得不在我的控制器中使用var vm = this,因爲我使用了controllerAs:「vm」選項;據我所知,這是不正確的,你在控制器函數中使用的內容與你在視圖中引用該控制器屬性無關。
所以,使用controllerAs:'vm'只意味着你將不得不使用「vm」。在視圖中的符號。它與控制器功能中將使用的變量無關(如果這是錯誤的,請糾正我,但從目前爲止所瞭解的情況來看,情況並非如此)。

0

您只需範圍注入到控制器。如果您沒有再壓縮-ING你中央社簡單地把$scope作爲參數傳遞給ImagePreviewController

function ImagePreviewController($scope) { 
     ... 
    } 

此外,如果縮小-ING是很重要的附加:ImagePreviewController.$inject = ['$scope'];控制器定義如下。

如果你想使用數組文本語法,聲明這樣說:

var ImagePreviewController = ['$scope', function ($scope) { ... }]; 

然後,您可以通過訪問$scope.images圖像陣列。我更喜歡使用$inject屬性,只是作爲風格問題。您想要使用的這個/自己的工作流程只有在您希望控制器本身公開其他指令使用的API時纔有用。

以供將來參考,角文檔具有指示和不同方式的一個非常完整的描述,你可以撰寫他們:https://docs.angularjs.org/guide/directive

+0

從我迄今爲止所瞭解的情況來看,通過使用「bindToController」,變量可在控制器的「this」對象上使用,不需要$ scope。 – 2015-04-03 10:41:58

0

但是你可以使用[directiveElement] .getIsolatedScope()function.It的可用everywhere.Maybe此功能可以幫助您通過其他方式解決您的問題。

相關問題