0

Я хочу, чтобы обещание было возвращено с контроллера на директиву, так как я хочу изменить шаблон на основе полученного обещания.

LoginController:

(function() { 
    angular.module('nd') 
    .controller('LoginController', loginController); 

    function loginController(
    $scope, 
    modelFactory, 
    User, 
    APPLICATION, 
    REST_URL, 
    $resource 
    ) { 

    $scope.user = modelFactory.create('user', User); 

    $scope.login = login; 

    function login() { 
     var resource = $resource(APPLICATION.host + REST_URL.login); 
     var promise = resource.save($scope.user); 
     return promise; 
    } 
    } 
})(); 

Директива Кнопка:

(function() { 
    angular.module('nd') 
    .directive('ndButton', button); 

    function button() { 
    return { 
     restrict: 'E', 
     scope: { 
     ndLable: '@', 
     ndClick: '&' 
     }, 
     templateUrl: '../components/fields/button/button.template.html', 
     link: link 
    }; 

    function link(scope) { 
     scope.clickButton = function() { 
     var promise = scope.ndClick(); 
     promise.$promise.then(function(user) { 
      console.log(user); 
     }); 
     }; 
    } 
    } 
})(); 

login.html:

<form ng-submit="login()"> 
    <div class="input-container"> 
    <nd-text-box 
     ng-model="user.username" 
     nd-lable="Username" 
     nd-id="Username" 
     nd-required="required"></nd-text-box> 
    <div class="bar"></div> 
    </div> 
    <div class="input-container"> 
    <nd-password 
     ng-model="user.password" 
     nd-lable="Password" 
     nd-id="Password" 
     nd-required="required"></nd-password> 
    <div class="bar"></div> 
    </div> 
    <div class="button-container"> 
    <nd-button nd-lable="Go"></nd-button> 
    </div> 
    <div class="footer"><a href="#">Forgot your password?</a></div> 
</form> 

шаблон кнопки:

<button ng-click="clickButton()"> 
    <span>{{ndLable}}</span> 
</button> 

В директиве, в scope.ndClick(), она с вызовом функции login() контроллера. В контроллере я получаю promise как { $promise: Promise, $resolved: false }. Я возвращаюсь promise назад в директиве, но в директиве я получаю обещание как неопределенное.

+0

Вы можете указать шаблон входа, в котором вы используете директиву? – war1oc

+0

@ war1oc, я обновил свой вопрос. –

ответ

1

login.html

<div class="button-container"> 
    <nd-button nd-lable="Go" ndClick="login()"></nd-button> 
</div> 

Свяжите $scope.login метод ndClick

+0

Он работает ... Можете ли вы объяснить мне, почему ng-submit не работает ...? –

+0

'ng-submit' будет работать, если у вас есть вход с' type = "submit". Вам также нужно отправить функцию в директиву, чтобы она связывалась с '&', поэтому вы можете позже вызывать функцию из вашего директивного контроллера. – war1oc

+0

Получил, спасибо @ war1oc ... –

1

Я не могу сказать вам, почему вы получаете неопределенное значение как возвращаемое значение. Я создал скрипку и получил тот же результат. Я думаю, что это вопрос сферы. Может быть, кто-то еще может это объяснить. Однако я бы предложил использовать фабрику или службу для хранения пользовательских данных, чтобы вы могли использовать ее во всем своем приложении. Вот скрипка, в которой используется фабрика для обмена данными между несколькими контроллерами и директивой/компонентом: https://jsfiddle.net/trollr/rjuvagb9/

В противном случае вы можете добавить дополнительную двустороннюю привязку к области своей директивы для синхронизации данных.

function button() { 
    return { 
    restrict: 'E', 
    scope: { 
     ndLable: '@', 
     ndClick: '&', 
     ndPromise: '=' 
    }, 
    templateUrl: '../components/fields/button/button.template.html', 
    link: link 
}; 

Шаблон:

<button nd-promise="loginPromise" nd-click"login()">..</button> 

Контроллер:

function login() { 
    var resource = $resource(APPLICATION.host + REST_URL.login); 
    $scope.loginPromise = resource.save($scope.user).$promise; 
} 
+0

Я хочу изменить шаблон кнопки на основе обещания, поэтому я хочу, чтобы в директиве было обещание, чтобы я мог легко изменить шаблон. –

+0

Измените мой ответ. Просто передайте обещание 'resource.save ($ scope.user). $ Prom' в данные, и он должен работать так, как ожидалось. Возможно, ndData - неправильное имя. – trollr

+0

Приятный трюк, я обязательно буду использовать это, если я не смогу исправить проблему «вернуть неопределенный». –